一,WebMagic介绍
WebMagic企业开发,比HttpClient和JSoup更方便
一),WebMagic架构介绍
WebMagic有DownLoad,PageProcessor,Schedule,Pipeline四大组件,并有Spider将他们组织起来,这四大组件对应就是爬虫的下载,处理,管理,持久化等功能。
Spider将这几个组件串联起来,让他们可以相互交互,流程化执行,可以认为Spider是一个巨大的容器,他也是webMagic逻辑的核心
WebMagic框架:
1,DownLoad负责从互联网上下载页面交给PageProcessor处理,WebMagic使用Apache HttpClient作为下载工具。
2,PageProcessor负责解析页面,抽取有用数据,以及发现新的链接。WebMagic使用Jsoup作为解析HTML工具,并基于其开发了解析Xpath的Xsoup。
四个组件中,PageProcessor对于每个站点都不一样,需要使用者自行定义。
3,Schedule负责管理抓取的URL,以及一些去重工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合进行去重。也支持Redis的分布式管理。
4,Pipeline负责抽取结果的计算,持久化到文件,数据库等。WebMagic默认提供“输出到控制台”和保存到文件两种处理方案。
如果需要保存到数据库,则需要编写对应的Pipeline,对于一类需求,一般只需要编写一个Pipeline。
二),用于数据流转的对象
1,request
request是对URL地址的一层封装,一个request对应一个URL;
他是PageProcessor和DownLoad交互的载体,也是PageProdessor控制Download的唯一方式。
除了URL本身,还包含一盒key-value结构的完整字段extra,可以在extra中保存一些特殊的属性,然后在其他地方进行读取,以及完成不同的功能。
2,page
Page及使用Download下载的页面——可能是一个HTML,也可能是JSON或者其他文本。
Page是WebMagic抽取数据的核心对象,他提供了一些方法可供抽取、结果保存等。
3,ResuleItems
ResultItems相当于一个Map,他用于保存PageProcessor处理的结果,供Pipeline使用。他的API和Map类似,但有一个字段skip,若设置为true,则不会被Pipeline处理。
二,入门程序
添加打印日志配置文件
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🇲🇲ss,SSS} [%t] [%c]-[%p] %m%n
引入WebMagic的依赖
<!--webMagic依赖-->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.4</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.4</version>
</dependency>
public class JobProcessor implements PageProcessor {
//page:解析的页面,由Spider容器处理。
public void process(Page page) {
//解析page,并将结果以key——value的形式保存在ResultItems中
//page.getHtml():获取html,也就是dom文档
//.css():selector选择器
//"head > title":head的直接子标签
//以css方式获取
page.putField("title",page.getHtml().css("head > title"));
//Xpath方式获取
page.putField("div",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a"));
//css方式获取
page.putField("div1",page.getHtml().css("div#shortcut-2014 div.w ul.fr > li > a"));
//正则表达式
page.putField("div2",page.getHtml().css("div#shortcut-2014 div.w ul.fr > li > a").regex(".*你好.*").all());
}
private Site site = Site.me();
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new JobProcessor())
.addUrl("https://kuaibao.jd.com/")//添加需要爬取的网页url
.run();//执行
//不需要执行打印,不设置输入流的位置,WebMagic默认输出在控制台
}
}
三,PageProcessor分析抽取页面元素
Xpath, 使用路径表达式来选取 XML 文档中的节点或节点集
CSS选择器 (同jquery选择器用法)
正则表达式, 一般用于获取url地址
WebMagic下Selectable抽取元素API
WebMagic处理结果的API
page.putField("div3",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").get());//在结果中抽取一条数据,默认第一条
page.putField("div3",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").toString());//在结果中抽取一条数据,默认第一条
page.putField("div3",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").all());//获取结果的全部数据
Schedule获取链接:page.addTargetRequest()
page.addTargetRequest(page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a").links().get());//获取查询结果的第一条超链接
page.putField("title",page.getHtml().css("head > title"));
四,Pipeline保存结果
WebMagic用于保存结果的组件叫做Pipeline,默认输出到控制是同一个内置的Pipeline——consolePipeline,如果想要输出到文件,只讲Pipeline换成FilePipeline就可以。
public static void main(String[] args) {
Spider.create(new JobProcessor())
.addUrl("https://kuaibao.jd.com/")//添加需要爬取的网页url
//不添加addPipeline则会将结果输出在控制台
.addPipeline(new FilePipeline("C:\\Users\\admin\\Desktop\\result\\"))//将结果保存在文件中
.thread(5)//设置多线程
.run();//执行
//不需要执行打印,不设置输入流的位置,WebMagic默认输出在控制台
}
五,爬虫的配置、启动和终止
Sipder是爬虫启动的入口,我们需要在启动爬虫前使用一个pageProcessor创建一个Spider对象,然后使用run()启动。
设置Spider组件都可以采用set方法进行设置
爬虫设置Site
Site.me()可以对爬虫进行一些配置,包括编码,抓取间隔,超时时间,重复次数等。
private Site site = Site.me()
.setCharset("utf8") //设置编码
.setTimeOut(10 * 1000) //设置超时间
.setRetryTimes(3) // 设置重复次数
.setRetrySleepTime(3 * 1000); // 设置重试时间间隔
public Site getSite() {
return site;
}
六, 爬虫分类
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫、增量式网络爬虫、深层网络爬虫。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的
通用网络爬虫
通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。
这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。 简单的说就是互联网上抓取所有数据。
聚焦网络爬虫
聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。
和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求 。简单的说就是互联网上只抓取某一种数据。
增量式网络爬虫
增量式网络爬虫(Incremental Web Crawler)是 指 对 已 下 载 网 页 采 取 增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。
和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面 ,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。简单的说就是互联网上只抓取刚刚更新的数据。
Deep Web 爬虫
Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。
表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词或者登陆后才能获得的 Web 页面