爬虫相关

一、反爬机制和应对措施

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把此任务记为已爬。

原文地址:https://www.cnblogs.com/kingshine007/p/11483387.html