常见的反爬虫技术 各种反爬虫机制和反反爬虫策略

首页 » Python » 常见的反爬虫技术 各种反爬虫机制和反反爬虫策略

不同的网站反爬机制也不同,判断一个网站是否有反爬机制需要根据网站设计架构,数据传输方式和请求方式多个方面来评估。以下是常见的反爬技术:

  • (1)用户请求的Headers。
  • (2)用户操作网站行为。
  • (3)网站目录数据加载方式
  • (4)数据乱码加密混淆。
  • (5)验证码识别。
  • (6)Robots协议。

网站设置反爬机制不代表不能爬取数据,所谓“魔高一尺道高一丈”,这句话可能用在这里不太合适,具体就是每种反爬机制都有对应的解决方案!

基于用户请求Headers

从用户请求的Headers反爬虫是最常见的反爬策略。很多网站会检测Headers中的User-Agent,大型网站还会对Referer进行检测。如果遇到了这类反爬虫机制,可以在爬虫代码中添加Headers请求头,将浏览器的请求信息以字典的形式写入爬虫请求头,具体方法如下

检测请求头的固定属性

固定属性是指请求头属性具有固定值或者按照一定的规律变化,例如User-Agent、Connection、Host、Referer等基本属性,这些属性在每个请求信息都可以找到,并且一般都是固定的。

如果爬虫程序中含有多线程或者多进程、异步并发功能,在同一时间发送多条HTTP请求,并且出现了异常错误:HTTPConnectionPool (host:XX)Max retries exceeded with url,这是请求队列已塞满HTTP请求的原因,需要在设置请求头属性Connection,属性值为close,这样可将已完成的HTTP请求关闭释放。

请求头属性Host是根据请求地址URL的变化而变化。一般情况下,Host的属性值与URL的域名信息一致,如果Host属性与URL域名不相符,就无法正常获取数据。

属性Referer说明当前请求来自哪个页面的URL,反爬虫机制引入属性Referer是利用HTTP防盗链技术显现。在HTTP协议中,当一个网页跳到另一个网页时,HTTP的请求头都会带有属性Referer,网站服务器通过检测Referer是否在服务器的域名名单,如果Referer不在域名名单中,则会被判为非法请求,无法获取正确的相应内容。

检测请求头的可变属性

可变属性是指请求头的属性以一定的计算方式变换属性,这类属性一般都是自行命名,其作用是生成反爬虫机制,反爬效果较好!有的网站会在请求头中加入时间戳,或者通过JS加密生成的随机字符串,这里需要自行判别处理。

基于用户操作网站行为

有的大型网站会对检测用户操作网页的行为是否符合规范,列如同一IP内短时间多次访问同一页面同一账户短时间内多次进行相同操作。网站服务器会根据已设定的判断条件判断访问间隔是否合理,从而达到检测用户行为是否合理。

遇到这种情况,可以使用代理IP,借助IP代理平台的API来获取是非常不错的方法。请求几次更换IP,很容易地绕过第一种反爬虫机制。

另一种方式是设置请求间隔,每次请求间隔几秒后在发送下一次请求。只需在代码里面添加一个延时功能就可以实现,对于平民玩家来说是一个不错的选择。个别网站可以通过请求几次、退出登录、重新登录、继续请求来绕过同一账号短时间内不能多次进行相同请求的限制!

基于网站目录数据加载

某些网站的数据属于动态网页,由Ajax通过访问接口方式生成数据加载到网页。遇到这样的情况,首先分析网页的设计,通过浏览器自带的抓包工具找到Ajax请求,分析具体的请求参数和响应数据结构,在爬虫中模拟Ajax请求,就能获取所需数据。

基于数据加密

一般来说网站会对某些数据接口的请求参数进行混淆加密,比方说:Web爬虫处理参数js加密、js混淆、js逆向这篇文章。可以先找到加密代码,一般都是JS实现的,分析代码的加密方式,然后再爬虫中模拟加密处理,再发送请求。这种方案花费时间比较长、难度较大。

另一种方案是通过Selenium+PhantomJS框架(自动化测试技术),调用浏览器内核,利用Selenium模拟认为操作网页并触发页面的JS脚本,完整地实现自动化操作网页,获取数据。这套框架几乎那个绕过大多数反爬虫机制,因为PhantomJS是一个没有界面的浏览器。Selenium+PhantomJS能解决很多事情,但是在爬虫中不到万不得已,一般不使用。

基本都是在寻找数据请求的参数,大致来源有:参数值为固定可选值、参数值来自其他请求的相应内容、参数值经过JS处理、参数值为特殊值。我们可以按照来源寻找请求的参数,这里说一下JS处理的该如何操作。

实现JS代码处理过程

请求参数进过JS处理时反爬虫最有效的手段之一,因为破解并还原JS处理过程相当耗时,会延长爬虫的开发周期。怕疾病还原JS处理有两种方法:

直接读取JS代码,在爬虫里还原JS处理并生成请求参数,这种方式需要对JS有所了解,例如虾米音乐的案例

另一种就是利用Python的JS运行库模拟运行JS代码,这种方法只需掌握JS代码的输入和输出即可,不用了解JS内部代码是如何实现的。python模拟库运行JS库有PyExecJS和pyv8,在Web爬虫处理参数js加密、js混淆、js逆向这篇文章中介绍了如何使用PyExecJS库。

这里以PyExecJS为例,使用pip命令就可以安装。JS代码是以字符串的形式表示,然后调用PyExecJS库的方法既可运行JS代码,例如:

import execjs
def exec_js(x,y):
    # 编译js代码
    ctx=execjs.complie("""
        function add(x,y) {
            return x*y;  
        }""")
    # 执行JS代码
    return ctx.call("add",x,y)
print(exec_js(2,2))

上述代码简单单调用了JS的add函数,函数参数x,y是在调用的过程中以变量的形式传入。具体操作可以上面的文章。

利用浏览器动态加载

如果请求的参数非常的复杂难以实现,可以使用Requests-HTML、SeleniumSplash等模块实现浏览器动态加载,只不过速度会有点慢。

基于验证码识别

最有效的反爬虫技术就是验证码,目前对于复杂的验证还没有做到很好地识别验证,只能通过第三方的打码平台进行识别。这里鳄鱼君Ba比较常用的就是超级鹰了,1块人民币就可以识别很多次了。还有一种方式就是通过OCR技术识别,准确率较低!

验证码出现的情况

1.登录页面设有验证码识别

登录页面是验证码出现频率最高的页面,它不仅可以提高用户的安全性,而且还可以反爬虫作用。基本上大型网站都会在登录页面设置不同的验证码,用来提高用户的安全性。

2.特殊请求设置验证码

在网页里对某些关键操作设置验证码,这种验证码出现的方式虽然很影响用户体验,但可以很好的防治数据泄露。这要应用在政府网站或商品抢购活动。

3.网络环境导致验证码出现

网络环境的不稳定因素主要是本地网络的IP地址已经被网站服务器列入黑名单。IP被列如黑名单的方式有很多,比如访问过于频繁,如果使用免费的代理IP,这也会造成验证码出现,网上很多的免费IP都是不安全的,使用这些不安全的代理IP,很容易遭到反爬虫拦截的。

验证码解决方案

1.使用OCR技术识别

OCR技术逐渐成熟,扩展性强,能满足开发人员二次开发,但是开发难度较大,如果没有经过二次开发或验证码训练,仅靠OCR自身的识别能力,准确率比较低!

2.使用第三方打码平台

这是一种不错的选择,正如上面提到的超级鹰一样,它可以准确的识别大部分验证码,而且准确率和响应速度快,价格也还算可以。

3.人为识别验证码

爬虫在运行过程中,如果出现验证码,会首先下载验证码图片,并且使用input函数使程序处于等待状态,然后人为的识别输入验证码,从而解决验证码识别问题。

4.使用Selenium控制程序实现识别验证码

如果页面出现验证码,使用Selenium模拟打开浏览器访问页面,并且爬虫程序必须要处于等待状态,然后人为在浏览器上完成验证码并退出爬虫程序的等待状态,让程序获取浏览器已完成验证码识别,因此在后续的HTTP请求中加入Cookies即可解决验证码问题。代码参考:

from selenium import webdriver
# 需要安装pywin32模块
import win32api,win32com
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 生成Windows提示框,让程序处于等待状态
# 当点击提示框的确定按钮,程序即可往下执行
win32api.MessageBox(0,"请识别验证码","提示",win32com.MB_OK)
# 获取浏览器的Cookie
cookies=driver.gen_cookies()
# Cookies格式化
cookie_dic={}
for i in cookies:
    cookie_dic[i['name']]=i['value']

5.从浏览器复制Cookies并写入程序

这是一种最常用的方式,用户登录一次就会保存用户登录状态,只要不退出登录或不删除浏览器的缓存,无论关闭浏览器还是重启计算机,当再次访问网站的时候,网站都会显示该用户上次登录的信息。当然有的网站会设置Cookies的时效性,超过时间就会过期,这时候重新登录获取即可!一般都需要对复制的Cookies转换为字典格式:

# 从浏览器获取的Cookies
cookie='bij=SDJIAD; uisi_=jdsi2; '
# Cookie格式化
cookie_dic={}
# 将Cookie转换为字典格式
for i in cookie.split(';'):
    key=i.split('=')[0]
    value=i.split('=')[1]
    cookie_dic[key]=value
print(cookie_dic)

基于Cookies的反爬虫

Cookies是网站为例辨别用户身份、进行Session跟踪而存储的在用户本地终端上的数据,一个Cookies就是存储在用户主机浏览器中的文本文件。网站利用Cookies设置反爬虫机制的主要方式有:限制Cookies的访问频率、限制Cookie的时效性。

限制Cookie的访问频率

在一定时间内,网站设置了同一用户的访问上限,如果超出访问上限,网站会认为当前用户是爬虫程序或机器人,从而引发反爬虫机制。爬虫开发者可以通过延迟每个HTTP请求的发送间隔,比如每个请求之间间隔设定为3秒、5秒或者10秒等。通过降低访问频率来避开反爬虫机制检测。

限制Cookies的时效性

限制Cookies的时效性主要通过JS处理,每次发送HTTP请求都会根据上一次请求的Cookies进行动态修改,改变后的Cookies将作为当前请求的Cookies信息,网站收到HTTP请求后,根据Cookie的处理逻辑去判断当前请求的Cookies是否正确,例如虾米音乐,该网站对Cookies的参数做了加密处理。如果判断结果为正确,网站则返回正确的响应内容,否则就不让你得到数据!

针对Cookies的反爬机制,可以采取以下几种方法处理:构建Cookies池、使用代理IP、动态构建Cookies和利用浏览器获取Cookies。

1.构建Cookies池

Cookies池是将不同的Cookies以列表的形式表示,在每次发送HTTP请求之前,从Cookies池随机收取某条Cookies信息作为HTTP请求的Cookies,这样能降低同一条Cookies的访问频率,避免反爬虫机制的检测。

一般情况下,一台计算机在网站只会有一个Cookies信息,如果使用同一台计算机生成多个不同的Cookies,则需要借助谷歌浏览器的无痕模式

首先打开谷歌浏览器,可以使用快捷键Shift+Ctrl+N打开无痕窗口,在这里我们也可以获取Cookies,关闭之前的无痕窗口,重新打开一个无痕窗口,获取Cookies,这两个Cookies的信息是不相同的,可以自己尝试一下。如果Cookies信息记录的用户登录信息,那么构建Cookies池就需要很多的用户账号。

2.使用代理IP

代理IP是解决Cookies反爬虫机制最有效的手段,它可以解决多用户使用同一个IP地址的安全问题,使用代理IP可以真实模拟多用户在访问网站。虽然谷歌的无痕窗口可以得到很多个不同的Cookies信息,但这些Cookies可能存储了计算机的IP地址等信息,如果网站服务器对这些信息进行检测,也很容易引发反爬虫机制。搭建免费的IP池可以学习,但是不建议上线使用。这里推荐智联HTTP,价格比较能接受!

3.动态构建Cookies

这个就是前面提到的虾米音乐,Cookies的某个参数是进过JS加密处理的,首先思考md5加密的方式,寻找加密的字符串,然后自己构造动态的参数,具体可参考文章详情内容。

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《常见的反爬虫技术 各种反爬虫机制和反反爬虫策略》 发布于2020-05-26

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

1 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册