WebMagic介绍
下载,处理,管理,持久化
数据流转对象
request:URL地址封装,是下载和处理的交互的载体
Page:下载的一个页面——Html,Json,文本格式
ResultItems:相当于一个map,保存PageProcesser处理的结果,提供Pipeline使用。一个字段skip,设置true,则不应被处理。
简单入门案例代码
需要导入 webmagic的工程‘
public class JobProcessor implements PageProcessor {
//这个方法解析页面
public void process(Page page) {
//解析返回数据page,并且把解析的结果放到ResultItem
page.putField("div",page.getHtml().css("div._2Kb8-nplK47lBDl_iifFWM" ).all());
}
private Site site=Site.me();
public Site getSite() {
return site;
}
//主函数执行爬虫
public static void main(String[] args) {
//Spider大的容器
Spider.create(new JobProcessor() )
//设置爬取页面的数据
.addUrl("https://kuaibao.jd.com/?ids=214569150,789182,223349485,790737")
.run();
实现PageProcess
抽取三种抽取技术:
Xpath:http://www.w3school.com.cn
正则表达式:
CSS选择器
Spider的方法
爬虫的配置,启动和终止
site.me()可以对爬虫进行配置配置,包括编码,抓取时间,超时时间
爬虫分类
通用网络爬虫;聚焦网络爬虫;增量式爬虫;DeepWeb爬虫
Scheduler组件
管理Url的组件:抓取URL队列进行管理;对已抓取的URL进行去重。
package cn.itcast.webmagic.test;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;
public class JobProcessor implements PageProcessor {
//这个方法解析页面
public void process(Page page) {
//解析返回数据page,并且把解析的结果放到ResultItem
page.putField("div",page.getHtml().css("div.dt cw-icon" ).all());
//xpath
page.putField("key2",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a"));
//正则
page.putField("div3",page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk ").regex(".*健康.*").all());
//获取连接 以2结尾
page.addTargetRequests(page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk data-log-url").links().regex(".*2$").all());
page.putField("url",page.getHtml().css("div.mt h1").all());
page.addTargetRequest("https://www.jd.com/news.html?id=37319");
page.addTargetRequest("https://www.jd.com/news.html?id=37319");
page.addTargetRequest("https://www.jd.com/news.html?id=37319");
}
//site.me()可以对爬虫进行配置配置,包括编码,抓取时间,超时时间
private Site site=Site.me()
.setCharset("utf8")
.setTimeOut(10000) //设置超时时间10ms
.setRetrySleepTime(30000)//设置重试的间隔时间
.setSleepTime(3)//设置重试次数
;
public Site getSite() {
return site;
}
//主函数执行爬虫
public static void main(String[] args) {
//Spider大的容器
Spider spider=Spider.create(new JobProcessor() )
//设置爬取页面的数据
.addUrl("https://kuaibao.jd.com/?ids=214569150")
//设置路径
.addPipeline(new FilePipeline("文件路经"))
//分配线程处理
.thread(5)
//设置布隆去重过滤器,添加依赖
.setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(1000)));
spider.run();
}
}
三种去重方式
HashSet;Redis;BloomFilter
public class JobProcessor implements PageProcessor {
//这个方法解析页面
public void process(Page page) {
//解析返回数据page,并且把解析的结果放到ResultItem
page.putField("div",page.getHtml().css("div.dt cw-icon" ).all());
//xpath
page.putField("key2",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a"));
//正则
page.putField("div3",page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk ").regex(".*健康.*").all());
//获取连接 以2结尾
page.addTargetRequests(page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk data-log-url").links().regex(".*2$").all());
page.putField("url",page.getHtml().css("div.mt h1").all());
page.addTargetRequest("https://www.jd.com/news.html?id=37319");
page.addTargetRequest("https://www.jd.com/news.html?id=37319");
page.addTargetRequest("https://www.jd.com/news.html?id=37319");
}
//site.me()可以对爬虫进行配置配置,包括编码,抓取时间,超时时间
private Site site=Site.me()
.setCharset("utf8")
.setTimeOut(10000) //设置超时时间10ms
.setRetrySleepTime(30000)//设置重试的间隔时间
.setSleepTime(3)//设置重试次数
;
public Site getSite() {
return site;
}
//主函数执行爬虫
public static void main(String[] args) {
//Spider大的容器
Spider spider=Spider.create(new JobProcessor() )
//设置爬取页面的数据
.addUrl("https://kuaibao.jd.com/?ids=214569150")
//设置路径
.addPipeline(new FilePipeline("文件路经"))
//分配线程处理
.thread(5)
//设置布隆去重过滤器,添加依赖
.setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(1000)));
spider.run();
}
}