WebMagic框架实现对58同城就业信息的爬取

简介

此信息的爬取,纯属是练习使用,没有用在商业用途。
WebMagic的设计参考了业界最优秀的爬虫Scrapy,而实现则应用了HttpClient、Jsoup等Java世界最成熟的工具。

WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成,核心代码非常简单,主要是将这些组件结合并完成多线程的任务。
在这里插入图片描述

导包

使用webmagic需要导入的基本包:

webmagic-core
webmagic-core是WebMagic核心部分,只包含爬虫基本模块和基本抽取器。WebMagic-core的目标是成为网页爬虫的一个教科书般的实现。

webmagic-extension
webmagic-extension是WebMagic的主要扩展模块,提供一些更方便的编写爬虫的工具。包括注解格式定义爬虫、JSON、分布式等支持。

页面分析

假设我们现在要爬取的是城市在北京的所有的岗位招聘信息。
58同城的页面的设计如下:
在这里插入图片描述
从这一个界面上大家就可以很容易的找到一些想要的基本的信息,比如说岗位、公司性质、薪资情况等信息。如果你需要的信息这些就足够了,那么你只需要对这一个界面进行分析爬取就好了。我这里为了获取更完善的信息,所以就进行了进一步的分析。

职位详细信息的界面设置如下:
在这里插入图片描述

链接分析

总体界面链接分析:
第一页的链接:
https://search.51job.com/list/010000,000000,0000,00,9,99,+,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=
第二页的链接:
https://search.51job.com/list/010000,000000,0000,00,9,99,+,2,2.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=

大家对这个链接进行分析,可以发现链接是有规律的,在同一个城市下的求职信息,链接的差别主要在 n.html 这个位置,所以如果只是获取这个页面的信息,链接的分析到此就可以结束了,直接对页面进行详细分析,如何用xpath 进行匹配到你想要获取的信息,就可以了。

详细页面链接分析:
第一个职位链接:
https://jobs.51job.com/beijing-tzq/124559934.html?s=01&t=0
第二个职位链接:
https://jobs.51job.com/beijing-cyq/117551387.html?s=01&t=0

这里我没有看出很容易处理的共同点来。所有这个链接就不能很简单的获取。但是我们可以从每一个汇总页的位置获得,大家可以多看几个链接进行分析,可以用正则表达式进行进一步的分析(这个方式似乎更方便一些)

页面HTML分析

所以我们这里就直接分析总页就可以了。
在这里插入图片描述
大家看到这里是不是已经很明显了,对于总页的每一个模块的链接是非常明显的,并且58同城的信息每一个模块的设置的格式是非常整洁的。可以看到每一个div的class属性是e,然后直接找子标签为a的标签的href属性就可以得到你想要的进一步的页面的链接。

所以,就进行了两步爬取分析。第一步是爬取相关招聘信息的网址,第二步是针对当前网址爬取招聘岗位的详细信息。

编写爬虫(这里只介绍一下爬取网址,详细信息过程一样)

  • 在WebMagic里面如果想要实现基本的爬虫,只需要编写一个类实现Pa geProcessor即可,需要重写process(Page page)方法
  • 爬虫的配置
    1、Spider
    Spider是爬虫启动的入口。在启动爬虫之前,我们需要使用一个PageProcessor创建一个Spider对象,然后使用run()进行启动。同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。
1
2
3
4
5
6
Spider.create(new URls())
.addUrl("url")
//使用文件保存抓取URL,可以在关闭程序并下次启动时,从之前抓取到的URL继续抓取(具体内容查看Scheduler的配置)
.setScheduler(new FileCacheQueueScheduler("./51jobUrl"))
.thread(5)
.run();

2、Site
对站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略等、代理等,都可以通过设置Site对象来进行配置。
private Site site = Site.me().setRetryTimes(3).setSleepTime(10000).setTimeOut(10000);

  • 抽取信息并且将信息保留下来

将获取到的页面进行xpath解析,xpath技术这里就不在赘述。.all()方法是返回所有抽取结果。

1
page.getHtml().xpath("//div[@class='el']//p[@class='t1']/span/a/@href").all()

将获得数据保存下来

1
page.putField("url",page.getHtml().xpath("//div[@class='el']//p[@class='t1']/span/a/@href").all());

因为我们这里需要将数据保存到数据库中,因此需要将数据从f ield中通过名称获取出来

1
String  a = page.getResultItems().get("url").toString();
  • 从页面发现后续的地址来进行抓取
    list是你要进行匹配的链接,可以是使用正则表达式进行匹配的,也可以是手动添加的等。
1
page.addTargetRequests(list);
  • 数据已经获得了,最后将这些数据插入到提前建设好的数据库就可以了。
  • 源码
    官方学习文档