WebMagic爬取拉钩
时间: 2024-02-10 22:05:56 浏览: 70
webmagic爬取数据
由于WebMagic是Java语言编写的爬虫框架,因此在爬取拉钩网站之前,需要先了解该网站的反爬虫机制。拉钩网站采用了多种反爬虫策略,如IP限制、UA限制、Cookie限制、滑块验证码等。因此,在爬取拉钩网站时,需要使用代理IP、随机UA、Cookie池等技术来应对反爬虫机制。
以下是使用WebMagic爬取拉钩网站的步骤:
1. 导入WebMagic依赖:在Maven中添加以下依赖:
```
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
```
2. 创建爬虫类:继承`Spider`类,并重写`process`方法,定义爬取逻辑。在`process`方法中,使用`Page`对象获取页面信息,并使用`Selectable`对象解析页面数据。如下所示:
```
public class LagouSpider extends Spider {
private static final String URL_TEMPLATE = "https://www.lagou.com/zhaopin/Java/%d/?filterOption=%d";
private static final String COOKIE = "cookie"; // 替换为自己的Cookie
private static final int MAX_PAGE = 30;
public LagouSpider(PageProcessor pageProcessor) {
super(pageProcessor);
}
@Override
public void process(Page page) {
List<Selectable> jobList = page.getHtml().css("div#s_position_list ul.item_con_list li.con_list_item").nodes();
for (Selectable job : jobList) {
String jobName = job.css("div.p_top h3").xpath("string(.)").get();
String companyName = job.css("div.company div.company_name a").xpath("string(.)").get();
String salary = job.css("div.p_bot div.li_b_l span").xpath("string(.)").get();
String workLocation = job.css("div.position div.li_b_l").regex(".*?<em>(.*?)</em>").get();
System.out.println("职位名称:" + jobName);
System.out.println("公司名称:" + companyName);
System.out.println("薪资待遇:" + salary);
System.out.println("工作地点:" + workLocation);
System.out.println("===========================");
}
}
public static void main(String[] args) {
Spider spider = Spider.create(new LagouPageProcessor())
.addUrl(String.format(URL_TEMPLATE, 1, 3))
.addCookie("Cookie", COOKIE)
.thread(5);
for (int i = 2; i <= MAX_PAGE; i++) {
spider.addUrl(String.format(URL_TEMPLATE, i, 3));
}
spider.run();
}
}
```
在上面的代码中,`LagouSpider`继承了`Spider`类,并在`process`方法中解析了职位名称、公司名称、薪资待遇和工作地点等信息。`main`方法中设置了起始URL、Cookie和线程数,并循环添加URL,最后启动爬虫。
3. 创建页面处理器类:继承`PageProcessor`类,并重写`process`方法,定义页面解析逻辑。如下所示:
```
public class LagouPageProcessor implements PageProcessor {
private Site site = Site.me()
.setRetryTimes(3)
.setSleepTime(1000)
.setCharset("UTF-8")
.addHeader("User-Agent", UserAgentUtil.getRandomUserAgent());
@Override
public void process(Page page) {
if (page.getUrl().regex("https://www.lagou.com/zhaopin/Java/.*").match()) {
page.addTargetRequests(page.getHtml().css("div.pager_container a").nodes()
.stream().map(Selectable::links).flatMap(Collection::stream)
.map(link -> link + "&filterOption=3").collect(Collectors.toList()));
page.addTargetRequests(page.getHtml().css("div#s_position_list ul.item_con_list li.con_list_item div.p_top a").links().all());
} else if (page.getUrl().regex("https://www.lagou.com/jobs/.*").match()) {
page.putField("jobName", page.getHtml().css("div.position-head div.name h1").xpath("string(.)").get());
page.putField("companyName", page.getHtml().css("div.company").regex(".*?公司信息</h3>(.*?)</div>").get());
page.putField("salary", page.getHtml().css("div.position-head div.salary").xpath("string(.)").get());
page.putField("workLocation", page.getHtml().css("div.position-head div.job_request p").regex(".*?<em>(.*?)</em>.*?<em>(.*?)</em>").get(1));
}
}
@Override
public Site getSite() {
return site;
}
}
```
在上面的代码中,`LagouPageProcessor`继承了`PageProcessor`类,并在`process`方法中解析了职位名称、公司名称、薪资待遇和工作地点等信息。`getSite`方法中设置了重试次数、睡眠时间、字符集和随机UA。
4. 运行爬虫:在`LagouSpider`类的`main`方法中启动爬虫即可。
需要注意的是,在爬取拉钩网站时,需要使用代理IP、随机UA和Cookie池等技术来应对反爬虫机制。另外,拉钩网站的页面结构比较复杂,需要使用`Selectable`对象进行解析,具体使用方法可以参考WebMagic的官方文档。
阅读全文