爬虫:利用工具模拟浏览器,访问网页,获取目标网页数据。(自己理解)
传统爬虫:利用类似HttpClient、hutool这些http请求工具对网页进行请求,对response响应数据,再利用jsoup等html解析工具进行解析,如果单个线程不能满足需求,可以利用类似Executor这种调度工具,来并发执行。
WebCollector,最新是2.73,这个框架的优点简单有几个:
- 快速开发,可以完全依赖框架本身的内核处理器 ,对网页进行请求爬取、解析。
- 自动搜索响应的请求信息,将响应信息中的url进行自动爬取。(addRegex方法过滤爬取内容,自动对绝对路径进行填充。)
- 对爬取的内容进行自动查重。
- 允许断点爬取。
package cn.edu.hfut.dmic.webcollector.example;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.rocks.BreadthCrawler;
/**
* 本教程和深度遍历没有任何关系
* 一些爬取需求希望加入深度信息,即遍历树中网页的层
* 利用2.20版本中的新特性MetaData可以轻松实现这个功能
*
* @author hu
*/
public class DemoAnnotatedDepthCrawler extends BreadthCrawler {
public DemoAnnotatedDepthCrawler(String crawlPath, boolean autoParse) {
super(crawlPath, autoParse);
for (int i = 1; i <= 5; i++) {
addSeed(new CrawlDatum("http://news.hfut.edu.cn/list-1-" + i + ".html")
.meta("depth", 1));
}
/*正则规则用于控制爬虫自动解析出的链接,用户手动添加的链接,例如添加的种子、或
在visit方法中添加到next中的链接并不会参与正则过滤*/
/*自动爬取类似"http://news.hfut.edu.cn/show-xxxxxxhtml"的链接*/
addRegex("http://news.hfut.edu.cn/show-.*html");
/*不要爬取jpg|png|gif*/
addRegex("-.*\\.(jpg|png|gif).*");
/*不要爬取包含"#"的链接*/
addRegex("-.*#.*");
}
@Override
public void visit(Page page, CrawlDatums next) {
System.out.println("visiting:" + page.url() + "\tdepth=" + page.meta("depth"));
}
@AfterParse
public void afterParse(Page page, CrawlDatums next) {
//当前页面的depth为x,则从当前页面解析的后续任务的depth为x+1
int depth = 1;
//如果在添加种子时忘记添加depth信息,可以通过这种方式保证程序不出错
try {
depth = page.metaAsInt("depth");
} catch (Exception ex) {
}
depth++;
next.meta("depth", depth);
}
public static void main(String[] args) throws Exception {
DemoAnnotatedDepthCrawler crawler = new DemoAnnotatedDepthCrawler("crawl", true);
crawler.getConf().setTopN(5);
crawler.start(3);
}
}
这是源码中,作者做的demo。这里主要有两点对于初学者,有点蒙。
- addRegex("http://news.hfut.edu.cn/show-.*html"); /*正则规则用于控制爬虫自动解析出的链接,用户手动添加的链接,例如添加的种子、或在visit方法中添加到next中的链接并不会参与正则过滤*/
- visit方法的时候,什么时候执行?(第一层,添加的种子,第二层,开始对响应的数据进行匹配抓取。可以利用page.url()理解。)
高级操作,比如metadate,301,302,cookie,自定义封装请求。可以看源码和官方教程。
教程:https://www.oschina.net/p/webcollector
源码:https://github.com/CrawlScript/WebCollector.git