一、获取及解析方式
由于需要爬取大数量非精确网页,所以不能根据网站特征构造请求,造成很多完全由JS构造的页面不能成功获取HTML。
目前有两种方案。
1.由htmlunit等工具执行页面中的JS,获取返回值并操作。
2.使用浏览器引擎加载,真实模拟浏览器。
方案1:通常而言,htmlunit等工具可以解析简单的JS语句,但对大量JS(尤其是全部JS写成的页面)并不能有效的执行
方案2 亦有不可忽视的缺点。
1.尽管可以设置不读取CSS,但完全等待JS执行完毕依旧需要时间,效率较低。
2.由于使用了Phantomjs,在不加以控制的情况下,多线程的phantomjs容易出现问题。不能正常关闭的phantomjs也会浪费大量资源。
而项目的需求侧重准确性,要求尽量不缺失数据,所以决定选取第二种方案。
缺陷解决方案:采用多进程而非线程开启phantomjs添加任务。
二、框架选用
由于后续开发可能涉及hadoop,而目前并无hadoop环境,所以决定采用webcollector框架。
该框架支持多种获取数据的driver模式。如httpclient,htmlunit,selenium,phantomjs等。
解析方面,亦支持主流CSS选择器,正则等常用筛选。
可多线程执行任务(此处需做约定或封装线程数以保证phantomjs正常运行),可自动去除重复url。目前使用2.x版本,值得注意2.x以后得webcollector版本是不支持redis的,只有1.x支持。2.x以后只保留了berkeleyDB和RamDB(内存数据库其实就是Map)
其中berkeleyDB支持断点续爬,而RamDB不支持(显而易见)
疑惑之处在于阅读源码时发现RamDB并非使用HashTable或ConcurrentHashMap,那是如何保证多线程添加任务时不会出错的?注:merge方法似乎并非多线程
另外,在定制爬虫时可添加种子与过滤正则。此处需要注意,此时添加的正则并不会使用于在visit方法中添加的任务。也就是说,若后续链接由JS代码生成,则webcollector不会自动添加页面中url。
@@@构造方法中正则是否会影响visit中添加的url。
其他选择:
nutch也可满足需求。但首先对nutch爬取动态页面的方式不了解,其次目前公司尚无hadoop环境,暂不考虑。
webmagic未读源码,看介绍更适合针对特定网站做定向爬取,并不适宜大规模非精确爬取的业务需求,暂舍。
失败处理
原文:https://www.cnblogs.com/Simon-M/p/11096346.html