WebMagic是一款爬虫框架,其底层用到以前学习到的HttpClient 和 Jsoup ,可让咱们更方便的开发爬虫。css
WebMagic 项目代码分为核心和扩展两部分html
WebMagic 的设计目标是尽可能的模块化,并体现爬虫的功能特色。这部分提供了很是简单、灵活的API,在基本不改变开发模式的状况下,编写爬虫。 扩展部分提供一些便捷的功能,例如注解模式编写爬虫等。同事内置一些经常使用的组件,便于爬虫开发。java
WebMagic 的结构分为 Downloader、PageProcessor、Scheduler、Pipeline四大组件,并有 Spider 将它们彼此组织起来。这四大组件分别对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic 的设计参考了 Scrapy(Python中的),可是实现方式更Java化一些。git
结构执行流程以下: github
用于数据流转的对象web
Request Request(请求)跟咱们web中学习的同样,Request是对 URL 地址的一层封装,一个Request对应一个URL地址; 它是 PageProcessor 与 Downloader 交互的载体,也是 PageProcessor 控制 Downloader 惟一方式。正则表达式
Page Page 表明了从 Downloader 下载到的一个页面——多是HTML,也多是JSON或者其余文本格式的内容; Page 是 WebMagic 抽取过程的核心对象,它提供一些方法可供抽取、结果保存等。apache
ResultItems ResultItems 至关于一个Map,它保存 PageProcessor 处理的结果,供 Pipeline 使用; 它的API与Map很相似,其中它有一个字段 skip,为true时,则不该该被 Pipeline处理。markdown
<dependencies>
<!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
</dependencies>
复制代码
ps: 0.7.3版本对SSL的并不彻底,若是是直接从 Maven 中央仓库下载的依赖,在爬取只支持 SSL v1.2 的网站会有SSL的异常抛出。cookie
解决方案:
下载解压(照顾一下 git用的不溜的小伙伴,就不使用 git了)
跳过测试
WebMagic 已使用slf4j-log4j12做为 slf4j 的实现,无需导包。
加配置文件
log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] %m%n
复制代码
public class JobProcessor implements PageProcessor {
public static void main(String[] args) {
Spider.create(new JobProcessor()) // new一个本身所写的JobProcessor对象
.addUrl("http://112.124.1.187/index.html")
.run();
}
// 负责解析页面
@Override
public void process(Page page) {
// 解析返回的数据page,而且把解析的结果放到 ResultItems 中
page.putField("首页通知",page.getHtml().css("div.content h2").all());
}
// 这个,将就写着,入门案例嘛,后面讲到
private Site site = Site.me();
@Override
public Site getSite() {
return site;
}
}
复制代码
ps: 这里解析页面数据:"page.putField("首页通知",page.getHtml().css("div.content h2").all()); ” 使用到的是 css抽取元素,除此以外,还有 XPath、正则表达式 的方法来抽取元素,他们还能够拼接使用,这个能够本身去了解。 在抽取的过程当中,总有可能抽取到多条元素,可以使用不一样的API获取一个或多个元素:
page.putField("首页通知",page.getHtml().css("div.content h2").gt() // 一个元素(默认第一个)
page.putField("首页通知",page.getHtml().css("div.content h2").toString() // 一个元素(默认第一个)
page.putField("首页通知",page.getHtml().css("div.content h2").all() // 全部元素
复制代码
// 放在上面的 process 方法中执行。
// 获取连接
// 这一行代码,获取,当前页面中抽取出来的带有其余 URL 地址的元素
page.addTargetRequests(page.getHtml().css(".excerpt_ban p").links().all());
// 这之间,作了一个跳转。下面的代码针对目标url地址的页面
// 这一行代码,获取,目标 url 的HTML页面中,你要抽取的元素
page.putField("连接抓取,博客标题",page.getHtml().css(".blog_title h4").all());
复制代码
图解:
WebMagic 用于保存结果的组件叫 Pipeline,默认向控制台输出结果,由内置的Pipeline(ConsolePipeline)完成;
将结果保存到文件中,将 Pipeline 的实现换成 FilePipeline.
Spider 是爬虫启动的入口。在启动爬虫以前,咱们须要使用一个 PageProcessor 建立一个 Spider 对象,而后使用run()启动。 同时,Spider 的其余组件(Downloder、Scheduler、Pipeline) 均可以配置。
create(PageProcessor)
建立Spider
addUrl(String .. urls)
添加初始的URL
thread(int n)
开启n个线程
run()
启动,会阻塞当前线程执行
start()/runAsync()
异步启动,当前线程继续执行
stop
中止爬虫
addPipeline(Pipeline p)
添加一个 Pipeline ,一个Spider能够有多个Pipeline
setScheduler(Scheduler s)
设置 Scheduler,一个Spider能够有多个 Scheduler
setDownloader(Downloader d)
设置 Downloader,一个Spider只能有一个 Downloader
get(String str)
同步调用,并直接取得结果
getAll(String ...str)
同步调用,并直接取得一堆结果
站点自己的一些配置信息,例如编码、HTTP头、超时时间、重试策略、代理等,均可以经过 Site 对象进行配置。
// 这个,将就写着,入门案例嘛,后面讲到
private Site site = Site.me()
.setCharset("utf-8") // 设置编码
.setTimeOut(10 * 1000) // 设置超时时间,单位:毫秒
.setSleepTime(10) // 抓取间隔时间
.setCycleRetryTimes(10 * 1000) // 重试的时间
.setRetryTimes(3) // 重试次数
;
复制代码
setCharset(String charSet)
设置编码setUserAgent(String str)
设置 UserAgentsetTimeOut(int ms)
设置超时时间,单位:毫秒setRetryTimes(int num)
设置重试次数setCycleRetryTimes(int num)
设置循环重试次数addCookie(String key,String val)
添加一条 cookiesetDomain(String str)
设置域名,需设置域名后,addCookie才可生效addHeader(String s1,String s2)
添加一条 请求头部setHttpProxy(HttpHost host)
设置 Http 代理