一、webmagic入门程序(原理图)
使用方法
1)创建工程
2)添加jar包
<dependencies>
<!--WebMagic-->
<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>
<!--WebMagic对布隆过滤器的支持-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0</version>
</dependency>
</dependencies>
注意:0.7.3版本对SSL的并不完全,如果是直接从Maven中央仓库下载依赖,在爬取只支持SSL v1.2的网站会有SSL的异常抛出。
解决方案:
1.等作者的0.7.4的版本发布
2.直接从github上下载最新的代码,安装到本地仓库
课堂提供的本地仓库中是已经修复完成的,可以直接使用
3)创建一个PageProcess对象,需要实现PageProcessor接口创建实现类。
4)在实现类中实现页面解析的业务逻辑。和设置解析参数
public class MyPageProcessor implements PageProcessor {
/**
* 页面解析的业务逻辑
* @param page 下载结果封装到Page对象中
*/
public void process(Page page) {
//抓取传智播客首页打印html
Html html = page.getHtml();
String strHtml = html.toString();
//把解析结果传递给pipeline
/*ResultItems resultItems = page.getResultItems();
resultItems.put("html", strHtml);*/
page.putField("html", strHtml);
Selectable url = page.getUrl();
}
/**
* 抓取站点信息的参数配置
* 抓取的频率
* 超时时间
* 编码格式
* 。。。
* @return
*/
public Site getSite() {
//没有设置参数,使用默认参数
return Site.me();
}
5)创建一个main方法,在方法中初始化爬虫并启动。
public static void main(String[] args) {
Spider.create(new MyPageProcessor())
//设置起始的url
.addUrl("http://www.itcast.cn")
//启动爬虫
//同步方法,在当前线程中启动爬虫
//.run();
//异步方法,创建新的线程启动爬虫
.start();
}
二、组件介绍
1、Downloader组件
下载器组件,从互联网现在html页面,并封装成Page对象,传递给PageProcess组件。
就是使用HttpClient实现。
如果没有特殊需求,此组件无需自定义。
2、PageProcess组件
爬虫的核心组件,PageProcessor负责解析页面,抽取有用信息,以及发现新的链接,使用爬虫时,此组件 必须自定义。
1)Site
站点参数的配置。
抓取的间隔时间
超时时间
编码格式
UserAgent
…
一般情况下使用默认参数即可。
返回一个Site对象,使用Site.me();
具体修改代码参照:
private Site site = Site.me()
.setCharset("UTF-8")//编码
.setSleepTime(1)//抓取间隔时间
.setTimeOut(1000*10)//超时时间
.setRetrySleepTime(3000)//重试时间
.setRetryTimes(3);//重试次数
2)Page,可以理解为分发器,把自己内部的属性,分发给响应组件。
Html:Downloader组件抓取的页面封装成Html对象。也是一个Selectable对象
url:当前页面对应的url地址,是一个Selectable对象
ResultItems:从PageProcess向pipeline传递数据的对象。
本质上就是一个map
Request:一个Request就是一个url。
page对象:
addTargetRequest:向队列中添加一个url
addTargetRequests:向队列中批量添加url
3)Selectable对象
-- Html对象支持使用Jsoup原生api
css选择器解析页面:
css()、$()
使用xpath解析页面:
xpath()
解析xml的一种方法。
使用正则表达式
regex()
解析页面不推荐使用正则表达式。推荐使用css选择器。
*3.正则表达式
正则表达式则是一种通用的文本抽取语言。在这里一般用于获取url地址。
正则表达式学习难度要大一些,大家可以参考课堂资料《正则表达式系统教程.CHM》
下面的例子就是获取https://www.jd.com/moreSubject.aspx这个页面中
所有符合https://www.jd.com/news.\w+?.正则表达式的url地址
并将这些链接加入到待抓取的队列中去
把Selectable对象转换成字符串:
toString()、get()
如果结果是一个列表的话,只取第一个元素。
all()
可以吧Selectable转换成字符串,转换成一个List<String>
links()
取当前节点中所有的链接地址。
nodes()
选择节点,返回一个List<Selectable>对象
public void process(Page page) {
Html html = page.getHtml();
//解析title
Document document = html.getDocument();
String title = document.select("title").text();
//传递给pipeline
page.putField("title", title);
//使用css选择器解析
Selectable selectable = html.css("title", "text");
//String title2 = selectable.toString()