
从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。当然,在这里我们只讨论数据采集部分。
通过Headers反爬虫
从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。
1 通过Headers User-Agent 反爬虫
反爬原理:User-Agent字段中记录着用户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等,如果爬虫时没有携带此参数则会被判定为爬虫。
解决办法:在header,中添加User-Agent即可,更好的方式是使用User-Agent池来解决,我们可以考虑收集一堆User-Agent的方式,或者是随机生成User-Agent。
2 通过referer字段或者是其他字段来反爬
反爬原理:Referer字段是记录当前请求是从那个网页发起的。
解决办法:通过添加上响应的referer字段即可
基于用户行为反爬虫
1 基于请求频率或者总请求数量
还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。
解决办法:对于这种情况,使用代理IP就可以解决了。
2 通过同一IP/账号请求之间的时间间隔进行反爬
反爬原理:正常人操作浏览器浏览网站,请求之间的时间间隔是随机,而爬虫前后两个请求之间时间间隔通常比较固定,同时时间间隔较短,因此可以用来做反爬
解决办法:请求之间进行随机等待,模拟真实用户操作,在添加时间间隔后,为了能够高速获取数据,尽量使用代理池,如果是账号,则将账号请求之间设置随机休眠
动态页面的反爬虫
上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的。
解决办法:进行抓取和寻找想要的数据包直接进行请求/使用selenium、splash等浏览器渲染框架来进行模拟浏览器进行爬取。