使用WebMagic定制爬虫

使用WebMagic定制爬虫


WebMagic是一个简单灵活的Java爬虫框架。基于WebMagic,你可以快速开发出一个高效、易维护的爬虫。

WebMagic的总体架构如下图所示

Downloader

Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了Apache HttpClient作为下载工具。

PageProcessor

PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。

在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。

Scheduler

Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。

除非项目有一些特殊的分布式需求,否则无需自己定制Scheduler。

Pipeline

Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。

Pipeline定义了结果保存的方式,如果你要保存到指定数据库,则需要编写对应的Pipeline。对于一类需求一般只需编写一个Pipeline

根据WebMagic的文档我们能够很快写出一个爬虫。比如下面就是一个爬取糗事百科的简单爬虫Demo

import java.util.List;
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;
public class QSBKPageProcesser implements PageProcessor{
	private Site site = Site.me()
			.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1) QQBrowser/6.0")
			.setDomain("www.qiushibaike.com").setTimeOut(5000).setRetryTimes(5);
	public void process(Page page) {
		String url = page.getUrl().toString();
		if(url.contains("article")){
			//解析内容界面
			System.out.println(page.getHtml().xpath("//div[@class='content']/text()").toString());
		}else{
			//解析列表界面
			List<String> list = page.getHtml().xpath("//a[@class='contentHerf']/@href").all();
			page.addTargetRequests(list);
		}
	}
	public Site getSite() {
		return this.site;
	}
	public static void main(String[] args) {
		Spider spider = Spider.create(new QSBKPageProcesser()).addPipeline(new ConsolePipeline());
		for(int i=1;i<9;i++){
			spider.addUrl("https://www.qiushibaike.com/8hr/page/"+i+"/?s=4996915");
		}
		spider.run();
	}
}

最后爬虫的输出结果如下

get page: https://www.qiushibaike.com/8hr/page/1/?s=4996915
get page: https://www.qiushibaike.com/8hr/page/2/?s=4996915
get page: https://www.qiushibaike.com/8hr/page/3/?s=4996915
get page: https://www.qiushibaike.com/8hr/page/4/?s=4996915
get page: https://www.qiushibaike.com/8hr/page/5/?s=4996915
get page: https://www.qiushibaike.com/8hr/page/6/?s=4996915
get page: https://www.qiushibaike.com/8hr/page/7/?s=4996915
get page: https://www.qiushibaike.com/8hr/page/8/?s=4996915
 那天去海边游泳,有一位大哥穿着上衣游,我不禁问他:“大哥,为什么你不光膀子游,衣服贴在身上多难受!”大哥脱了上衣给我看,身体上面有文胸的白色?迹。我正惊疑不定,大哥抹了一把脸说:“我前天撩起背心晒日光浴,没想到晒成这样,怪我没经验.....” 
get page: https://www.qiushibaike.com/article/119336220
 小学放假的一天,爸爸让我在家好好写作业,怕我偷看电视,就把总闸拉下来,去地里干活了。但是,架不住我聪明啊。等他们走了,我自己偷偷的合上闸看电视。为了怕他们发现电视后壳发热,我提前一段时间就关了电视。可是,那顿打我还是没有逃过去,我忘了电表是会动的! 
get page: https://www.qiushibaike.com/article/119337633
 三个宿舍舍友出去聚餐,十一个人正好一桌,结账的时候约好大家各人掏出一张银行卡给服务员抽一张刷,服务员抽到第四张余额不足的时候终于发飙了 
get page: https://www.qiushibaike.com/article/119337499
 嫂子炸乎乎的打来电话:你哥摊上大事了!被人给告了!我一惊,忙安慰她:别着急,有话好好说,啥事谁告的?她:你八岁的大侄子告的呀,揍了他一顿,就跑到街头派.出所告你哥虐待儿童,你哥正在所里接受教育呢…… 
get page: https://www.qiushibaike.com/article/119337859
 LZ农村的割…… 小时候和老妈 我弟一起去上山砍柴,砍累了就坐在树下乘凉 ,我弟就趴树上去摇树枝玩,突然…… 树上掉下一条蛇落在我头上,当时我和蛇都惊呆了……呆了……了 
get page: https://www.qiushibaike.com/article/119335791
 在家无聊,想去看个电影,到电影院买票,一张45,给了售票员一张一百,她居然找我10块,我手里拿着钱,和售票员对视五秒后…她用非常惊讶的表情问我:你一个人看电影? …靠 有谁规定看电影必须两个人么! 你妹的 
get page: https://www.qiushibaike.com/article/119336589
 爷爷年轻的时候脾气比较暴躁,喝醉酒就打奶奶,奶奶一直忍气吞声的过日子。现在儿女都在外面安家落户,70多岁的爷爷还是跟奶奶生活在老家,不愿意来城里跟我们一起住。昨晚爷爷又打电话过来:儿子啊,你快管管你娘吧,这个星期已经揍了我三回,我现在打不过他啊。 
get page: https://www.qiushibaike.com/article/119337603

可见,使用WebMagic构建一个爬虫是十分便捷的,不逊色于Python的Scrapy。😃

posted on 2019-06-05 22:04  yanximin  阅读(378)  评论(0编辑  收藏  举报

导航