应对反爬的主要思路就是:尽可能的去模拟浏览器,浏览器在如何操作,代码中就如何去实现。
1.通过User-Agent反爬
爬虫发送请求时,请求头中默认没有User-Agent,或者提供非正常的UA。
应对思路:在请求时添加UA
具体应对:
requests模块发送请求时在headers参数中UA键值对
selenium默认自带被控制浏览器的UA,也可以替换UA
随机User-Agent
2.通过Referer来反爬
Referer是header的一部分,当浏览器向web服务器发送请求的时候,会带上Refer,告诉服务器是从哪个页面链接过来的。
爬虫发送请求时,请求头中默认情况下不会带上Referer字段。
应对思路:在请求时添加Referer
具体应对:
requests模块发送请求时在headers参数中添加Referer键值对,从抓包信息中复制Referer信息
selenium默认自带Referer
3.通过Cookie来反爬
无论是否需要登陆,web服务器都可以在用户的浏览器中设置Cookie;Cookie是header的一部分,当浏览器向web服务器发送请求的时候,如果存在Cookie就一定会携带。
web服务器检查请求头中cookie是否是之前设置的cookie
应对思路:
携带cookie发送请求
具体应对:
requests模块发送请求时,使用requests.session自动处理cookie
用requests模块发送请求时,在cookie参数或者headers参数中,使用selenium获取的cookie;注意cookie的过期时间。
构建cookie池(根据cookie的过期时间,定期批量获取的cookie,放到数据库中),requests模块发送请求时,使用从cookie池中获取的cookie
4.通过js加密请求参数、解密加密的数据来反爬
利用用户的浏览器执行web服务器返回的js代码来对加密的响应内容进行解密(不常见)
利用用户的浏览器执行web服务器返回的js代码来对请求参数进行加密,之后再发送请求(常见)
应对思路:python重写js代码的功能或者执行js代码拿到结果
具体应对:
完全看不懂js代码:selenium
完全看懂js代码:python重写js代码的功能
能够看懂js代码执行的大致过程:使用js2py模块运行相关的js代码,获取运行结果
5.通过行为验证来反爬
对方服务器通过弹出验证码强制验证用户浏览行为
应对思路:使用打码平台或深度学习的方式破解验证码
具体应对:
打码平台
人工输入
深度学习
6.通过ip地址来反爬
正常用户很难在很短的时间内打开需要点击才能访问的链接,那么网站就可以根据ip地址和cookie以及user-agent等能区分不同用户身份的信息进行反爬
检测同一个ip在单位时间内是否发送了大量请求
经常和cookie以及user-agent配合检查
应对思路:
网上获取免费的代理ip
购买代理ip
使用代理ip池
具体应对:
构建代理ip池
把免费以及收费的代理ip放到数据库中
使用是随机获取一个代理ip
向目标url发送请求,并设置超时
如果超时或无法使用就在数据库中标记该代理ip对具体访问的url不可用
requests模块发送请求使用proxies参数
selenium可以通过配置对象来使用代理ip
7.通过自定义字体来反爬
利用浏览器能够加载渲染并正确显示自定义字体的功能,使用自定义字体不影响正常用户浏览
应对思路:
从移动端页面获取数据
处理并解析自定义字体
具体应对:
切换到移动端的页面,如用浏览器移动端模式访问