- 1. WebMagic 概览
- 1.1 设计思想
- 1.2 总体架构
- 1.3 项目组成
- 2. 快速开始
- 2.1 使用Maven
- 2.2 不使用Maven
- 2.3 第一个爬虫项目
- 3. 下载和编译源码
- 3.1 下载源码
- 3.2 导入项目
- 3.3 编译和执行源码
- 4. 编写基本的爬虫
- 4.1 实现 PageProcessor
- 4.2 使用 Selectable 抽取元素
- 4.3 使用Pipeline保存结果
- 4.4 爬虫的配置、启动和终止
- 4.5 Jsoup与Xsoup
- 4.6 爬虫的监控
- 4.7 配置代理
- 4.8 处理非 HTTP GET 请求
- 5. 使用注解编写爬虫
- 5.1 编写Model类
- 5.2 TargetUrl与HelpUrl
- 5.3 使用ExtractBy进行抽取
- 5.4 在类上使用ExtractBy
- 5.5 结果的类型转换
- 5.6 一个完整的流程
- 5.7 AfterExtractor
- 6. 组件的使用和定制
- 6.1 使用和定制 Pipeline
- 6.2 使用和定制 Scheduler
- 6.3 使用和定制 Downloader
- 附录:实例分析
- 列表 + 详情的基本页面组合
- 抓取前端渲染的页面
5.3 使用ExtractBy进行抽取
5.3 使用ExtractBy进行抽取
@ExtractBy
是一个用于抽取元素的注解,它描述了一种抽取规则。
5.3.1 初识ExtractBy注解
@ExtractBy注解主要作用于字段,它表示“使用这个抽取规则,将抽取到的结果保存到这个字段中”。例如:
@ExtractBy("//div[@id='readme']/text()")
private String readme;
这里"//div[@id='readme']/text()"是一个XPath表示的抽取规则,而抽取到的结果则会保存到readme字段中。
5.3.2 使用其他抽取方式
除了XPath,我们还可以使用其他抽取方式来进行抽取,包括CSS选择器、正则表达式和JsonPath,在注解中指明type
之后即可。
@ExtractBy(value = "div.BlogContent", type = ExtractBy.Type.Css)
private String content;
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 = "//div[@class='BlogTags']/a/text()", multi = true) private List<String> tags;
0.4.3及以后
@ExtractBy("//div[@class='BlogTags']/a/text()") private List<String> tags;
5.3.5 ComboExtract(已废弃)
@ComboExtract
是一个比较复杂的注解,它可以将多个抽取规则进行组合,组合方式包括"AND/OR"两种方式。
在WebMagic 0.4.3版本中使用了Xsoup 0.2.0版本。在这个版本,XPath支持的语法大大加强了,不但支持XPath和正则表达式组合使用,还支持“|”进行或运算。所以作者认为,ComboExtract
这种复杂的组合方式,已经不再需要了。
XPath与正则表达式组合
@ExtractBy("//div[@class='BlogStat']/regex('\\d+-\\d+-\\d+\\s+\\d+:\\d+')") private Date date;
XPath的取或
@ExtractBy("//div[@id='title']/text() | //title/text()") private String title;
5.3.6 ExtractByUrl
@ExtractByUrl
是一个单独的注解,它的意思是“从URL中进行抽取”。它只支持正则表达式作为抽取规则。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论