1、Headers反爬虫 :Cookie、Referer、User-Agent
User-Agent
用户代理,是Http协议中的一部分,属于头域的组成部分,作用是描述发出HTTP请求的终端的一些信息。使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。服务器通过这个字段就可以知道访问网站的是什么人。对于不是正常浏览器的用户进行屏蔽。
解决方案: 伪装浏览器的User-Agent,因为每个浏览器的User-Agent不一样,并且所有的用户都能使用浏览器。所有每次请求的时候条件浏览器的User-Agent,就能解决UA检测。通过F12获取headers,传给requests.get()方法。或构造自己的User-Agent池,每次访问随机选择。
Referer
是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的。例如有一些图片网站在你请求图片的时候,就会检测你的Referer值,如果Referer不符合,不会返回正常的图片。
解决方案:在检测referer的请求中,携带符合的referer值。
2、IP限制 :网站根据IP地址访问频率进行反爬,短时间内禁止IP访问
WEB系统都是走http协议跟WEB容器连通的,每次请求至少会产生一次客户端与服务器的tcp连接。对于服务端来说可以很清楚的查看到,一个ip地址在单位时间内发起的请求。
当请求数超过一定的值之后,就可判断为非正常的用户请求。
解决方案
- 构造自己IP代理池,每次访问随机选择代理,经常更新代理池;
- 购买开放代理或私密代理IP;
- 降低爬取的速度;
- ADSL动态拨号他有个独有的特点,每拨一次号,就获取一个新的IP。也就是它的IP是不固定的;
设置访问时间间隔
很多网站的反爬虫机制都设置了访问间隔时间,一个IP如果短时间内超过了指定的次数就会进入“冷却CD”,所以除了轮换IP和user_agent
可以设置访问的时间间间隔长一点,比如每抓取一个页面休眠一个随机时间:
import time import random time.sleep(random.random()*3)
对于一个crawler来说,这是一个比较responsible的做法。 因为本来爬虫就可能会给对方网站造成访问的负载压力,所以这种防范既可以从一定程度上防止被封,还可以降低对方的访问压力。
3、验证码
验证码(CAPTCHA)是“Completely Automated PublicTuring test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
解决方案:
- 手动识别验证码
- pytesseract识别简单的验证码
- 对接打码平台
- 机器学习
4、 js混淆和渲染
JavaScript 混淆是:
- 去掉一些实际没有调用的函数。
- 将零散的变量声明合并。
- 逻辑函数的精简。
- 变量名的简化。具体要看不同的压缩工具的考虑优劣。常见的有UglifyJS、JScrambler等工具。
js渲染其实就是对HTML页面的修改。比如有一些网页本身没有返回数据,数据是经过js加载之后添加到HTML当中的。当遇到这种情况的时候,我们要知道爬虫是不会执行JavaScript操作。所以需要用其他的方法处理。
解决方案:
- 通过阅读网站js源码,找到关键的代码,并用python实现。
- 通过阅读网站js源码,找到关键的代码,用PyV8,execjs等库直接执行js代码。
- 通过selenium库直接模拟浏览器环境
其他
1、对查询参数或Form表单数据认证(salt、sign)
解决方案: 找到JS文件,分析JS处理方法,用Python按同样方式处理
2、对响应内容做处理
解决方案: 打印并查看响应内容,用xpath或正则做处理