笔记-大规模爬虫实现逻辑,问题及解决办法


笔记-大规模爬虫实现逻辑,问题及解决办法

1. 简单爬虫的实现逻辑

第一步:爬取种子urls;

第二步:解析response,获得新的urls;

第三步:重复1、2步,达到指定条件后结束爬取。

2. 爬取100000或更多个网页的实现逻辑

如果仍然按上述方法处理,问题来了:

  1. 总耗时太长:解决办法是使用多线程,分布式;
  2. url管理:使用多线程,分布式以后,应该设计一个数据结构(LIFO,FIFO)来管理,而不仅仅是列表;功能至少包括去重,失败后重入队列;url优先级管理,对不同的url,应该使用不同的优先级;
  3. 爬取深度问题:深度与url数是指数上涨的;
  4. ban问题:对于规模够大的爬虫,很容易被识别然后禁止访问:

  接下来一一讨论解决办法

2.1.1多线程

  多线程:考虑到I/O一般比下载快,那么,在下载时使用多线程是较好的思路,无论是threading+lock还是threading+queue都可以实现,当然threading+redis也是可以的;

2.1.2分布式

只考虑分布式的简单实现,使用master/slave架构,需要一个任务队列管理机制,需要任务分发功能;

假设使用redis做队列管理,那么典型实现方式就是scrapy-redis了

基本思想是所有的detail_request放到redis中,由master服务器来管理和分发;

这种情况下架构的可伸缩性和可扩展性也还不错,存在主机单节点的问题,但可以满足大部分项目的需要了。

2.2 url管理

url管理包括两个方面:

1.有效性管理

简单来说就是去重,爬取深度;

去重:网站网页之间的关系是一个图状结构,很可能在解析中出现重复的url,对于这重复url应有过滤措施;

  由master分发任务的爬虫,去重一般由master负责;

爬取深度:深度越大,信息相关性越低,网页数量越大;

2.抓取策略

爬虫的不同抓取策略,就是利用不同的方法确定待抓取URL队列中URL优先顺序的。

爬虫的抓取策略有很多种,但不论方法如何,基本目标一致:优先选择重要网页进行抓取

效果较好或有代表性的抓取策略:
1、宽度优先遍历策略
2、非完全PageRank策略
3、OCIP策略
4、大站优先策略

2.4 反爬及反反爬

爬虫识别方法及反反爬方法:

  1. headers识别:简单来说就是通过http头识别爬虫:

    解决办法:当然是伪装headers;

    关键词:多个header随机,refer,禁cookie;

  2.动态网页:很多网站使用动态加载技术,流行SPA;

  解决办法:破解js,也可以使用浏览器模拟;

3.IP访问频率识别:对于爬虫,一般情况是大规模访问的,网站可以根据这一特点对高频访问的IP进行禁止

  解决办法:总而言之,换IP,控制频率;

  建立代理池然后轮询;

  ADSL重拨;

4.蜜罐:部分网页会在网页中放置正常用户不可见或不会触发的控件,链接,爬虫一旦触发就被ban;

  解决办法:人工识别然后在代码中避免触发,或使用浏览器模拟;

5.人类行为鉴别:部分网站使用人类行为轨迹鉴别爬虫,比如浏览网页停留时长,鼠标移动轨迹;

  解决办法:使用浏览器模拟:Selenium,PHANTOMJS

6.验证码:简单的可以使用图片处理解决,正规有价值的项目可以接入打码平台;

7.封账号:

  对于个人项目这个真没办法,解决成本太高,但一般通过降低频率可以避开;

  对于正式项目,只要收益足够,总会有解决办法的。

3.总结

大规模的爬虫实现逻辑总体是如上所述;

当然这只是最简单爬虫功能的模型化,一个真正可以运行的爬虫项目还得加上爬虫状态管理器,监控,告警系统,任务查看管理等组件。

优质内容筛选与推荐>>
1、从零学React Native之04自定义对话框
2、键盘事件
3、CentOS6上ftp服务器搭建实战
4、UVM:8.4.3 用factory 机制创建实例的接口
5、Kdevelop简单应用以及调试


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号