在使用webMagic之前,先了解一下几个基本的知识
- 爬虫,可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来。
- Xpath
Xpath的全称是 XML Path Language,XPath是一种称为路径表达式的语法,定位到XML或HTML中的任意一个或多个节点元素,获取元素的各项信息,在解析结构比较规整的XML或HTML文档的时候,用XPath路径表达式非常快速、方便。
对于概念看不懂也没关系,可以先看下面的代码然后再回过头来理解这些概念,这样可以加深对爬虫的理解
下面是WebMagic的架构图,从图中可以看出WebMagic有四个组件
- WebMagic组件
a. Downloader
Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了Apache HttpClient作为下载工具。
b. PageProcessor
PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。
c. Scheduler
Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。
d. Pipeline
Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。
- 导入依赖项目使用的是Gradle
testCompile group: 'junit', name: 'junit', version: '4.9'
compile group: 'us.codecraft', name: 'webmagic-core', version: '0.7.3'
compile group: 'us.codecraft', name: 'webmagic-extension', version: '0.7.3'
- 代码
public class CnBlogProcessor implements PageProcessor {
//抓取网站的相关配置、编码、抓取间隔、重试次数等
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
//计数器
private static int count = 0 ;
@Override
public void process(Page page) {
//判断连接是否满足
boolean flag = page.getUrl().regex("https://www.cnblogs.com/[a-z 0-9 -]+/p/[0-9]{7}.html").match();
if(!flag){
//加入满足条件的连接 xpath选取要爬取的div
page.addTargetRequests(page.getHtml().xpath("//*[@id=\"post_list\"]/div/div[@class='post_item_body']/h3/a/@href").all());
}else {
System.out.println("抓到的内容\n"+page.getHtml());
count++ ;
}
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new CnBlogProcessor()).addUrl("https://www.cnblogs.com/").thread(5).run();
System.out.println("结束了"+count);
}
}
这是一个简单爬取博客园文章的小demo,主要的重点是正则的编写以及熟悉xpath的基本概念,在要爬取指定的内容时,使用xpath可以很方便的定位到要取得元素,网页中标签的xpath怎么获取呢?首先打开开发者工具,然后选定某一元素
因为要选中鼠标右键,截图的时候鼠标会跳动一下,没办法截全。这篇文章带大家简单入门,下一篇文章带大家深入了解,如有错误,请指正
WebMagic官方文档