webmagic中文文档(3)

2019-01-27 21:20

导入后看到项目选择界面,点击finish即可。

3.3 编译和执行源码

导入成功之后,应该就没有编译错误了!此时你可以运行一下webmagic-core项目中自带的exmaple:\。 同样,看到控制台输出如下,则表示源码编译和执行成功了!

4. 基本的爬虫

在WebMagic里,实现一个基本的爬虫只需要编写一个类,实现PageProcessor接口即可。这个类基本上包含了抓取一个网站,你需要写的所有代码。

同时这部分还会介绍如何使用WebMagic的抽取API,以及最常见的抓取结果保存的问题。 4.1 实现PageProcessor

这部分我们直接通过GithubRepoPageProcessor这个例子来介绍PageProcessor的编写方式。我将PageProcessor的定制分为三个部分,分别是爬虫的配置、页面元素的抽取和链接的发现。

public class GithubRepoPageProcessor implements PageProcessor {

// 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等 private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override

// process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑 public void process(Page page) {

// 部分二:定义如何抽取页面信息,并保存下来 page.putField(\

page.getUrl().regex(\ page.putField(\page.getHtml().xpath(\public']/strong/a/text()\

if (page.getResultItems().get(\ //skip this page page.setSkip(true); }

page.putField(\ // 部分三:从页面发现后续的url地址来抓取

page.addTargetRequests(page.getHtml().links().regex(\ }

@Override

public Site getSite() { return site; }

public static void main(String[] args) {

Spider.create(new GithubRepoPageProcessor()) //从\开始抓 .addUrl(\ //开启5个线程抓取 .thread(5) //启动爬虫 .run(); } }

4.1.1 爬虫的配置

第一部分关于爬虫的配置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置,我们会在第5章-“爬虫的配置”里进行介绍。在这里我们先简单设置一下:重试次数为3次,抓取间隔为一秒。 4.1.2 页面元素的抽取

第二部分是爬虫的核心部分:对于下载到的Html页面,你如何从中抽取到你想要的信息?WebMagic里主要使用了三种抽取技术:XPath、正则表达式和CSS选择器。另外,对于JSON格式的内容,可使用JsonPath进行解析。

1. XPath

XPath本来是用于XML中获取元素的一种查询语言,但是用于Html也是比较方便的。例如: page.getHtml().xpath(\

这段代码使用了XPath,它的意思是“查找所有class属性为'entry-title public'的h1元素,并找到他的strong子节点的a子节点,并提取a节点的文本信息”。 对应的Html是这样子的:

2. CSS选择器

CSS选择器是与XPath类似的语言。如果大家做过前端开发,肯定知道$('h1.entry-title')这种写法的含义。客观的说,它比XPath写起来要简单一些,但是如果写复杂一点的抽取规则,就相对要麻烦一点。

3. 正则表达式

正则表达式则是一种通用的文本抽取语言。

page.addTargetRequests(page.getHtml().links().regex(\

这段代码就用到了正则表达式,它表示匹配所有\https://github.com/code4craft/webmagic\这样的链接。

4. JsonPath

JsonPath是于XPath很类似的一个语言,它用于从Json中快速定位一条内容。WebMagic中使用的JsonPath格式可以参考这里:https://code.google.com/p/json-path/ 4.1.3 链接的发现

有了处理页面的逻辑,我们的爬虫就接近完工了!

但是现在还有一个问题:一个站点的页面是很多的,一开始我们不可能全部列举出来,于是如何发现后续的链接,是一个爬虫不可缺少的一部分。

page.addTargetRequests(page.getHtml().links().regex(\ 这段代码的分为两部分,page.getHtml().links().regex(\用于获取所有满足\/github\\.com/\\w+/\\w+)\这个正则表达式的链接,page.addTargetRequests()则将这些链接加入到待抓取的队列中去。 4.2 使用Selectable的链式API

Selectable相关的链式API是WebMagic的一个核心功能。使用Selectable接口,你可以直接完成页面元素的链式抽取,也无需去关心抽取的细节。

在刚才的例子中可以看到,page.getHtml()返回的是一个Html对象,它实现了Selectable接口。这个接口包含一些重要的方法,我将它分为两类:抽取部分和获取结果部分。 4.2.1 抽取部分API: 方法

xpath(String xpath) $(String selector)

$(String selector,String attr) css(String selector) links()

regex(String regex) regex(String regex,int group) replace(String replacement)

regex,

说明

使用XPath选择 使用Css选择器选择 使用Css选择器选择

示例

html.xpath(\html.$(\html.$(\

功能同$(),使用Css选择器

html.css(\

选择 选择所有链接 使用正则表达式抽取

html.links() html.regex(\

使用正则表达式抽取,并指

html.regex(\

定捕获组

html.replace(\

String

替换内容

这部分抽取API返回的都是一个Selectable接口,意思是说,抽取是支持链式调用的。下面我用一个实例来讲解链式API的使用。

例如,我现在要抓取github上所有的Java项目,这些项目可以在https://github.com/search?l=Java&p=1&q=stars:>1&s=stars&type=Repositories搜索结果中看到。

为了避免抓取范围太宽,我指定只从分页部分抓取链接。这个抓取规则是比较复杂的,我会要怎么写呢?


webmagic中文文档(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:徐州市中高说课高创新要求

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: