爬虫相关
一、反爬机制和应对措施
1、通过Headers
措施:添加User-Agent和Referer
2、基于用户行为
措施:代理IP、延迟爬取
3、动态页面
措施:requests模拟ajax请求,如果请求加密了使用selenium+phantomJS
验证码解决:Tesseract
二、Scrapy运行机制及优缺点
从start_urls里获取第一批URL并发送给Scrapy引擎,引擎交给调度器进入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去下载资源,并将响应交给Spider编写的解析方法做提取处理
1、如果提取出需要的数据,交给管道进行处理
2、如果提取出URL,则继续入请求队列,执行前面的操作
优点:
1、异步的
2、采取可读性更强的Xpth代替正则
3、可以同时在不同的URL上爬取
4、支持Shell方式,方便独立调试
5、写中间件,方便写一些同一的过滤器
6、通过管道方式存入数据库
缺点:
1、基于python的爬虫框架,扩展性比较差
2、基于twisted异步框架,出错后不会停掉其他任务。数据出错很难察觉
三、代理IP及维护
透明代理:客户端根本不需要知道有代理服务器的存在,但是它传送的任然是真是的IP
普通匿名代理:能隐藏掉客户机的真是IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理
高匿名代理:不改变客户机的请求,客户的真实IP是隐藏的,服务器端不会认为我们使用了代理
维护:
一般代理的存活时间往往十几分钟。定时任务,加上代理IP去访问网页,验证是否可用,如果返回状态200,表示代理可用。
四、增量爬取
五、判断网站更新
使用MD5数字签名。每次下载网页时,把服务器返回的数据流先放在缓冲区,然后对其生成MD5数字签名S1,下次下载同样生成签名S2,比较S1和S2,如果相同,则页面没有更新,否则网页有更新。
六、爬取数据去重
1、使用scrapy自带的set集合去重,当程序结束的时候会被清空。缺点:再次运行会导致数据重复。
2、对url地址进行md5,base64加密,加密之后会得到一串字符,判断字符串是否在mysql表中,如果在表示已经爬取过了,如果不在,表示没有爬取。缺点: 但是这个方法对mysql压力过大,导致崩溃,不推荐
3、使用scrapy_redis的去重。会将已经爬取的url地址经过编码后存入redis,并且会做数据持久化,当爬虫再次启动时,会重新加载本地的数据,对爬虫的url做去重。缺点:如果数据量较大的时候,会占用较多的内存空间
4、使用布隆去重。采用多重哈希,将url地址映射到位阵列中的某个点上,空间和时间利用率更高(推荐)
七、分布式爬虫策略
1、Slaver端从Master端拿任务进行数据抓取,同时也生成新的任务,并将任务抛给Master。Master端只有一个Redis数据库,负责对Salver提交的任务去重,加入带爬队列。
2、Master端负责生产任务,并把任务去重,加入待爬队列。Slaver只管从Master端拿任务去爬。
3、Slaver在遇到新任务时询问Master此任务是否已爬,如果未爬则加入Slaver自己的待爬队列中,Master把此任务记为已爬。