笔记-大规模爬虫实现逻辑,问题及解决办法
1. 简单爬虫的实现逻辑
第一步:爬取种子urls;
第二步:解析response,获得新的urls;
第三步:重复1、2步,达到指定条件后结束爬取。
如果仍然按上述方法处理,问题来了:
接下来一一讨论解决办法
多线程:考虑到I/O一般比下载快,那么,在下载时使用多线程是较好的思路,无论是threading+lock还是threading+queue都可以实现,当然threading+redis也是可以的;
只考虑分布式的简单实现,使用master/slave架构,需要一个任务队列管理机制,需要任务分发功能;
假设使用redis做队列管理,那么典型实现方式就是scrapy-redis了
基本思想是所有的detail_request放到redis中,由master服务器来管理和分发;
这种情况下架构的可伸缩性和可扩展性也还不错,存在主机单节点的问题,但可以满足大部分项目的需要了。
url管理包括两个方面:
1.有效性管理
简单来说就是去重,爬取深度;
去重:网站网页之间的关系是一个图状结构,很可能在解析中出现重复的url,对于这重复url应有过滤措施;
由master分发任务的爬虫,去重一般由master负责;
爬取深度:深度越大,信息相关性越低,网页数量越大;
2.抓取策略
爬虫的不同抓取策略,就是利用不同的方法确定待抓取URL队列中URL优先顺序的。
爬虫的抓取策略有很多种,但不论方法如何,基本目标一致:优先选择重要网页进行抓取
效果较好或有代表性的抓取策略:
1、宽度优先遍历策略
2、非完全PageRank策略
3、OCIP策略
4、大站优先策略
爬虫识别方法及反反爬方法:
headers识别:简单来说就是通过http头识别爬虫:
解决办法:当然是伪装headers;
关键词:多个header随机,refer,禁cookie;
2.动态网页:很多网站使用动态加载技术,流行SPA;
解决办法:破解js,也可以使用浏览器模拟;
3.IP访问频率识别:对于爬虫,一般情况是大规模访问的,网站可以根据这一特点对高频访问的IP进行禁止
解决办法:总而言之,换IP,控制频率;
建立代理池然后轮询;
ADSL重拨;
4.蜜罐:部分网页会在网页中放置正常用户不可见或不会触发的控件,链接,爬虫一旦触发就被ban;
解决办法:人工识别然后在代码中避免触发,或使用浏览器模拟;
5.人类行为鉴别:部分网站使用人类行为轨迹鉴别爬虫,比如浏览网页停留时长,鼠标移动轨迹;
解决办法:使用浏览器模拟:Selenium,PHANTOMJS
6.验证码:简单的可以使用图片处理解决,正规有价值的项目可以接入打码平台;
7.封账号:
对于个人项目这个真没办法,解决成本太高,但一般通过降低频率可以避开;
对于正式项目,只要收益足够,总会有解决办法的。
大规模的爬虫实现逻辑总体是如上所述;
当然这只是最简单爬虫功能的模型化,一个真正可以运行的爬虫项目还得加上爬虫状态管理器,监控,告警系统,任务查看管理等组件。
优质内容筛选与推荐>>