WebMagic使用小结
一、总体架构
WebMagic的结构分为Downloader
、PageProcessor
、Scheduler
、Pipeline
四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy,但是实现方式更Java化一些。
Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。
WebMagic的四个组件
1、Downloader 负责下载页面
Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了Apache HttpClient作为下载工具。
2、PageProcessor 负责解析页面
PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。
3、Scheduler 调度URL
Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。
4、Pipeline 持久化到文件/数据库等
Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。
一般Downloader和Scheduler不需要定制
流程核心控制引擎 -- Spider ,用来自由配置爬虫,创建/启动/停止/多线程等
用于数据流转的对象
1. Request
Request
是对URL地址的一层封装,一个Request对应一个URL地址。
它是PageProcessor与Downloader交互的载体,也是PageProcessor控制Downloader唯一方式。
2. Page
Page
代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。
3. ResultItems
ResultItems
相当于一个Map,它保存PageProcessor处理的结果,供Pipeline使用。它的API与Map很类似,值得注意的是它有一个字段skip
,若设置为true,则不应被Pipeline处理。
官网详情:WebMagic官方中文文档
二、版本更迭差异
1、POST请求体
webMagic 0.7.0版本中移除了老的在request.extra中设置NameValuePair的方式,使用RequestBody 。
webMagic 0.7.0以下版本使用 Extra
Request request = new Request(""); request.setMethod(HttpConstant.Method.POST); NameValuePair[] nameValuePair = new NameValuePair[](){ new BasicNameValuePair("id","100"),new BasicNameValuePair("tag","2")}; request.setExtra("nameValuePair", nameValuePair); spider.addRequest(request);
webMagic 0.7.0以上版本使用 RequestBody
Request request = new Request(""); request.setMethod(HttpConstant.Method.POST); request.setRequestBody(HttpRequestBody.json("{'id':1}","utf-8"));
2、POST去重
从0.6.2版本开始,POST默认不会去重,详情见:Issue 484。如果想要去重可以自己继承DuplicateRemovedScheduler,重写push方法。
爬虫遇到的Post请求基本没有,所以大家也不用担心。如果遇到了,自己继承DuplicateRemovedScheduler,重写push方法。
三、SpringBoot整合WebMagic
1、添加Maven依赖
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency>
2、四个组件添加注解
WebMagic各个组件加Spring的组件注解,通过注解的自动调用,便可以融入SpringBoot的使用特性。如果在Application中采用new 对象的方法进行爬取,则Autowired注解会失效。
四、WebMagic日志配置
默认日志配置文件为log4j.properties
,放在项目工程的resource文件下即可。
# 全局日志级别设定 ,file log4j.rootLogger=INFO, stdout, file # 自定义包路径LOG级别 log4j.logger.org.quartz=WARN, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH:mm:ss}[%p]%m%n # Output to the File log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=F:\\java\\SearchJobPlatform\\5-SearchJobPlatform\\webmagic.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%n%-d{MM-dd HH:mm:ss}-%C.%M()%n[%p]%m%n
警告1:无配置文件
将配置文件添加至resource文件夹下即可正常输出日志。
警告2:多版本绑定
找到该jar包的来源,使用maven依赖树,探索该包的依赖关系,一路找下去,直至找到本工程直接写入的依赖。然后在该依赖下排除此jar包。
<dependency> <!- 这是我自己建的一个包,朔源过程中第一个是它引入这个jar包--> <groupId>com.couragehe.souzhi</groupId> <artifactId>souzhi-api</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> </exclusion> </exclusions> </dependency>
五、源码分析进阶
爬虫框架Webmagic源码分析之Spider
爬虫框架WebMagic源码分析之Scheduler
爬虫框架WebMagic源码分析之Downloader
爬虫框架WebMagic源码分析之Selector
爬虫框架WebMagic源码分析之Selenium
WebMagic之Spider进阶