爬虫技术选择

一、获取及解析方式

由于需要爬取大数量非精确网页,所以不能根据网站特征构造请求,造成很多完全由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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值