Expression Description XPath1.0 support not support
regex(@attr,expr,group) 这里@attr和group均可选,默认是group0 4.5.3 Saxon
Saxon是一个强大的XPath解析器,支持XPath 2.0语法。webmagic-saxon是对Saxon尝试性的一个整合,但是目前看来,XPath 2.0的高级语法,似乎在爬虫开发中使用者并不多。 4.6 爬虫的监控
爬虫的监控是0.5.0新增的功能。利用这个功能,你可以查看爬虫的执行情况——已经下载了多少页面、还有多少页面、启动了多少线程等信息。该功能通过JMX实现,你可以使用Jconsole等JMX工具查看本地或者远程的爬虫信息。 如果你完全不会JMX也没关系,因为它的使用相对简单,本章会比较详细的讲解使用方法。如果要弄明白其中原理,你可能需要一些JMX的知识,推荐阅读:JMX整理。我很多部分也对这篇文章进行了参考。
注意: 如果你自己定义了Scheduler,那么需要用这个类实现MonitorableScheduler接口,才能查看“LeftPageCount”和“TotalPageCount”这两条信息。 4.6.1 为项目添加监控
添加监控非常简单,获取一个SpiderMonitor的单例SpiderMonitor.instance(),并将你想要监控的Spider注册进去即可。你可以注册多个Spider到SpiderMonitor中。 public class MonitorExample {
public static void main(String[] args) throws Exception {
Spider oschinaSpider = Spider.create(new OschinaBlogPageProcessor()) .addUrl(\
Spider githubSpider = Spider.create(new GithubRepoPageProcessor()) .addUrl(\ SpiderMonitor.instance().register(oschinaSpider); SpiderMonitor.instance().register(githubSpider); oschinaSpider.start(); githubSpider.start(); } }
4.6.2 查看监控信息
WebMagic的监控使用JMX提供控制,你可以使用任何支持JMX的客户端来进行连接。我们这里以JDK自带的JConsole为例。我们首先启动WebMagic的一个Spider,并添加监控代码。然后我们通过JConsole来进行查看。
我们按照4.6.1的例子启动程序,然后在命令行输入jconsole(windows下是在DOS下输入jconsole.exe)即可启动JConsole。
这里我们选择启动WebMagic的本地进程,连接后选择“MBean”,点开“WebMagic”,就能看到所有已经监控的Spider信息了!
这里我们也可以选择“操作”,在操作里可以选择启动-start()和终止爬虫-stop(),这会直接调用对应Spider的start()和stop()方法,来达到基本控制的目的。
4.6.3 扩展监控接口
除了已有的一些监控信息,如果你有更多的信息需要监控,也可以通过扩展的方式来解决。你可以通过继承SpiderStatusMBean来实现扩展,具体例子可以看这里: 定制扩展demo。 5.使用注解编写爬虫
WebMagic支持使用独有的注解风格编写一个爬虫,引入webmagic-extension包即可使用此功能。
在注解模式下,使用一个简单对象加上注解,可以用极少的代码量就完成一个爬虫的编写。对于简单的爬虫,这样写既简单又容易理解,并且管理起来也很方便。这也是WebMagic的一大特色,我戏称它为OEM(Object/Extraction Mapping)。 注解模式的开发方式是这样的:
1. 首先定义你需要抽取的数据,并编写类。
2. 在类上写明@TargetUrl注解,定义对哪些URL进行下载和抽取。
3. 在类的字段上加上@ExtractBy注解,定义这个字段使用什么方式进行抽取。 4. 定义结果的存储方式。
下面我们仍然以第四章中github的例子,来编写一个同样功能的爬虫,来讲解注解功能的使用。最终编写好的爬虫是这样子的,是不是更加简单? @TargetUrl(\@HelpUrl(\public class GithubRepo {
@ExtractBy(value = \ private String name;
@ExtractByUrl(\ private String author;
@ExtractBy(\ private String readme;
public static void main(String[] args) {
OOSpider.create(Site.me().setSleepTime(1000)
, new ConsolePageModelPipeline(), GithubRepo.class) .addUrl(\ } }
5.1 编写Model类
同第四章的例子一样,我们这里抽取一个github项目的名称、作者和简介三个信息,所以我们定义了一个Model类。 public class GithubRepo { private String name; private String author; private String readme; }
这里省略了getter和setter方法。
在抽取最后,我们会得到这个类的一个或者多个实例,这就是爬虫的结果。 5.2 TargetUrl与HelpUrl
在第二步,我们仍然要定义如何发现URL。这里我们要先引入两个概念:@TargetUrl和@HelpUrl。
5.2.1 TargetUrl与HelpUrl
HelpUrl/TargetUrl是一个非常有效的爬虫开发模式,TargetUrl是我们最终要抓取的URL,最终想要的数据都来自这里;而HelpUrl则是为了发现这个最终URL,我们需要访问的页面。几乎所有垂直爬虫的需求,都可以归结为对这两类URL的处理:
? 对于博客页,HelpUrl是列表页,TargetUrl是文章页。 ? 对于论坛,HelpUrl是帖子列表,TargetUrl是帖子详情。 ? 对于电商网站,HelpUrl是分类列表,TargetUrl是商品详情。
在这个例子中,TargetUrl是最终的项目页,而HelpUrl则是项目搜索页,它会展示所有项目的链接。
有了这些知识,我们就为这个例子定义URL格式: @TargetUrl(\@HelpUrl(\public class GithubRepo { …… }
5.3 使用ExtractBy进行抽取
@ExtractBy是一个用于抽取元素的注解,它描述了一种抽取规则。 5.3.1 初识ExtractBy注解
@ExtractBy注解主要作用于字段,它表示“使用这个抽取规则,将抽取到的结果保存到这个字段中”。例如:
@ExtractBy(\
这里\是一个XPath表示的抽取规则,而抽取到的结果则会保存到readme字段中。
5.3.2 使用其他抽取方式
除了XPath,我们还可以使用其他抽取方式来进行抽取,包括CSS选择器、正则表达式和JsonPath,在注解中指明type之后即可。
@ExtractBy(value = \ 5.3.3 notnull
@ExtractBy包含一个notNull属性,如果熟悉mysql的同学一定能明白它的意思:此字段不允许为空。如果为空,这条抽取到的结果会被丢弃。对于一些页面的关键性属性(例如文章的标题等),设置notnull为true,可以有效的过滤掉无用的页面。 notNull默认为false。 5.3.4 multi(已废弃)
multi是一个boolean属性,它表示这条抽取规则是对应多条记录还是单条记录。对应的,这个字段必须为java.util.List类型。在0.4.3之后,当字段为List类型时,这个属性会自动为true,无须再设置。
? 0.4.3以前
@ExtractBy(value = \ 0.4.3及以后
@ExtractBy(\ 5.3.5 ComboExtract(已废弃)
@ComboExtract是一个比较复杂的注解,它可以将多个抽取规则进行组合,组合方式包括\两种方式。
在WebMagic 0.4.3版本中使用了Xsoup 0.2.0版本。在这个版本,XPath支持的语法大大加强了,不但支持XPath和正则表达式组合使用,还支持“|”进行或运算。所以作者认为,ComboExtract这种复杂的组合方式,已经不再需要了。
? XPath与正则表达式组合
@ExtractBy(\
?
XPath的取或
@ExtractBy(\ 5.3.6 ExtractByUrl
?
@ExtractByUrl是一个单独的注解,它的意思是“从URL中进行抽取”。它只支持正则表达式作为抽取规则。
5.4 在类上使用ExtractBy 在之前的注解模式中,我们一个页面只对应一条结果。如果一个页面有多个抽取的记录呢?例如在“QQ美食”的列表页面http://meishi.qq.com/beijing/c/all,我想要抽取所有商户名和优惠信息,该怎么办呢?
在类上使用@ExtractBy注解可以解决这个问题。 在类上使用这个注解的意思很简单:使用这个结果抽取一个区域,让这块区域对应一个结果。 @ExtractBy(value = \…… } 对应的,在这个类中的字段上再使用@ExtractBy的话,则是从这个区域而不是整个页面进行抽取。如果这个时候仍想要从整个页面抽取,则可以设置source = RawHtml。 @TargetUrl(\
@ExtractBy(value = \public class QQMeishi {
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库webmagic中文文档(5)在线全文阅读。
相关推荐: