Java爬虫框架WebMagic——入门(爬取列表类网站文章)
初学爬虫,WebMagic作为一个Java开发的爬虫框架很容易上手,下面就通过一个简单的小例子来看一下。
WebMagic框架简介
WebMagic框架包含四个组件,PageProcessor、Scheduler、Downloader和Pipeline,并由Spider将它们彼此组织起来。
这四大组件对应爬虫生命周期中的处理、管理、下载和持久化等功能。
而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。
WebMagic总体架构图如下:
四大组件
PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。需要自己定义。
Scheduler负责管理待抓取的URL,以及一些去重的工作。一般无需自己定制Scheduler。
Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。
Downloader负责从互联网上下载页面,以便后续处理。一般无需自己实现。
用于数据流转的对象
Request是对URL地址的一层封装,一个Request对应一个URL地址。
Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。
ResultItems相当于一个Map,它保存PageProcessor处理的结果,供Pipeline使用。
环境配置
使用Maven来添加依赖的jar包。
<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> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
或者直接摸我下载。
添加完jar包就完成了所有准备工作,是不是很简单。
下面来测试一下。
package edu.heu.spider; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.ConsolePipeline; import us.codecraft.webmagic.processor.PageProcessor; /** * @ClassName: MyCnblogsSpider * @author LJH * @date 2017年11月26日 下午4:41:40 */ public class MyCnblogsSpider implements PageProcessor { private Site site = Site.me().setRetryTimes(3).setSleepTime(100); public Site getSite() { return site; } public void process(Page page) { if (!page.getUrl().regex("http://www.cnblogs.com/[a-z 0-9 -]+/p/[0-9]{7}.html").match()) { page.addTargetRequests( page.getHtml().xpath("//*[@id=\"mainContent\"]/div/div/div[@class=\"postTitle\"]/a/@href").all()); } else { page.putField(page.getHtml().xpath("//*[@id=\"cb_post_title_url\"]/text()").toString(), page.getHtml().xpath("//*[@id=\"cb_post_title_url\"]/@href").toString()); } }<br />public static void main(String[] args) { Spider.create(new MyCnblogsSpider()).addUrl("http://www.cnblogs.com/justcooooode/") .addPipeline(new ConsolePipeline()).run(); } }
输出结果:
如果你和我一样之前没有用过log4j,可能会出现下面的警告:
这是因为少了配置文件,在resource目录下新建log4j.properties文件,将下面配置信息粘贴进去即可。
目录可以定义成你自己的文件夹。
# 全局日志级别设定 ,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=D:\\MyEclipse2017Workspaces\\webmagic\\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
现在试一下,没有警告了吧