【反爬虫大全】爬虫学习者必须了解的当今各大网站反爬手段、反爬判断思路及绕过原理总结——以Python爬虫学习者的角度为例(长期更新...)

        由于博主对于爬虫的相关知识极度感兴趣,在大致自学完成了Python爬虫和Java爬虫的主要内容后,目前正在钻研反爬虫的原理。本文将会对反爬虫的相关知识进行总结,以方便之后在爬虫编码过程中的迅速回忆和查阅。因为博主尚且正在学习反爬虫,因此本文长期更新。



反爬虫的概念

反爬虫的原因

        开发者为了保证服务器的正常运转或降低服务器的压力与运营成本,不得不使用各种各样的技术手段来限制爬虫对服务器资源的访问。

反爬虫的简介

        限制爬虫程序访问服务器资源和获取数据的行为称为反爬虫。

反爬虫的划分

        限制爬虫的手段包括但不限于请求限制、拒绝响应、客户端身份验证、文本混淆和使用动态渲染技术。这些限制根据出发点可以分为主动型反爬虫和被动型反爬虫。

  • 主动型反爬虫:开发者有意识地使用技术手段区分正常用户和爬虫,并限制爬虫对网站的访问行为。(如:验证请求头信息、限制访问频率、使用验证码等)
  • 被动型反爬虫:为了提升用户体验或节省资源,用一些技术间接提高爬虫访问难度的行为。(如:数据分段加载、点击切换标签页、鼠标悬停预览数据等)

信息校验型反爬虫

        信息校验中的“信息”指的是客户端发起网络请求时的请求头和请求正文,而“校验”指的是服务器端通过对信息的正确性、完整性或唯一性进行验证或判断,从而区分正常用户和爬虫程序的行为。
        总体来说,信息校验型反爬虫是开发者主动实现的主动型反爬虫。

1.User-Agent反爬虫(难度:⭐)

1.1.反爬虫简介

        User-Agent反爬虫指的是服务器端通过校验请求头中的User-Agent值来区分正常用户和爬虫程序的手段,这是一种较为初级的反爬虫手段。

1.2.反爬虫判断思路

        面对目标网站的页面,分别使用三种不同的客户端(浏览器、测试工具Postman、爬虫程序)向服务器端发起请求。其中只有爬虫程序不能够得到正常的响应,并且是在第一次请求时就被拒绝(识别)了。

1.3.反爬虫原理说明

        三种不同的客户端,意味着可能具有三种不同的客户端标识,而在HTTP中只有User-Agent是最接近身份标识的。在网络请求中,User-Agent是客户端用于表明身份的一种标识,服务器通常通过该头域的值来判断客户端的类型。而服务器之所以选择User-Agent头域作为校验对象,是因为很多编程语言和软件有默认的标识。如Python的User-Agent值如下所示:

python-requests/2.21.0

1.4.反爬虫绕过方法

        测试发现,加上User-Agent请求头域,可正常响应目标网站请求。常见的User-Agent头域如下所示:

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'

1.5.总结

        由于User-Agent头域的存在,服务器可以使用黑名单结合条件判断实现针对性较强的反爬虫。除了User-Agent以外,常见的用于反爬虫的头域还有Host和Referer。这种验证请求头信息中特定头域的方式既可以有效地屏蔽长期无人维护的爬虫程序,也可以将一些爬虫初学者发起的网络请求拒之于门外。

2.Cookie反爬虫(难度:⭐)

2.1.反爬虫简介

        Cookie反爬虫指的是服务器端通过校验请求头中的Cookie值来区分正常用户和爬虫程序的手段,这种手段被广泛应用在Web应用中。

2.2.反爬虫判断思路

        面对目标网站的页面,分别使用三种不同的客户端(浏览器、测试工具Postman、爬虫程序)向服务器端发起请求。其中测试工具Postman和爬虫程序得到的响应内容都不是目标页面的内容,因此通过切换多个浏览器访问目标页面进行观察测试。
        打开Firefox开发者工具中的网络选项,点击重发,出现302状态码。302状态码代表临时重定向,证明客户端向服务器发起的请求出现了重定向。此时再次访问目标页面,能够正常访问,响应状态码为200。

2.3.反爬虫原理说明

        Cookie不仅可以用于Web服务器的用户身份信息存储或状态保持,还能够用于反爬虫。
        对于Cookie反爬虫,浏览器会自动检查响应头中是否存在Set-Cookie头域,如果存在,则将值保存在本地,而且往后的每次请求都会自动携带对应的Cookie值,此时只要服务器端对请求头中的Cookie进行校验即可。服务器会校验每个请求头中的Cookie值是否符合规则,如果通过校验,则返回正常资源,否则将按照服务器配置进行重定向到指定页面,同时在响应头中添加Set-Cookie头域和Cookie值。

2.4.反爬虫绕过方法

        对比状态码为200时的请求头信息和状态码为302时的请求头信息,可发现状态码为200的请求头中有Cookie。测试发现,通过在请求头中添加Cookie头域和值,并在请求发送时携带请求头,即可正常访问目标网站的网页。

2.5.总结

        固定值的Cookie或者固定位置和固定数量字符拼接而成的随机变化的字符串Cookie很容易被看穿,因此开发者可能会针对Cookie进行进一步的反爬设置。比如:在JavaScript代码中生成当前时间的时间戳,将时间戳与随机字符串拼接后再作为Cookie值发起请求。此时服务器不仅需要按规则校验随机字符串,还需要获取服务器的当前时间戳,将Cookie值中取出的时间戳与当前时间戳进行差值计算,当时间差值超过一定的时间(如5秒),则可以认定Cookie是伪造的。
        User-Agent和Cookie都是请求头的默认头域,在值的设定方面有一定的局限性,但是与js结合后就会变得很灵活。但是,相对于服务器软件来说,后端程序的校验更为灵活且准确,但使用后端程序进行校验所需的步骤又较多。

3.签名验证反爬虫(难度:⭐⭐)

3.1.反爬虫简介

        签名是根据数据源进行计算或加密的过程,签名的结果是一个具有唯一性和一致性的字符串。签名结果的特性使它成为验证数据来源和数据完整性的条件,可以有效避免服务器端将伪造的数据或被篡改的数据当成正常数据处理。
        签名验证是防止恶意连接和数据被篡改的有效方式之一,也是目前后端API最常用的防护方式之一。用于签名验证的信息通常被放在请求正文中被发送到服务器端。

3.2.反爬虫判断思路

        打开Network网络请求,查看网络请求记录。找到xhr类型的文档请求记录,切换到Response面板,查看请求对应的相应正文,发现正是目标网页加载的内容。虽然目标内容存储在该请求的响应正文中,但是此时请求该url地址是拿不到数据的。当发现请求正文中包含信息摘要值(特征是32位随机字符串)时,我们就可以大胆的猜测目标网站使用了签名验证反爬虫。

3.3.反爬虫原理说明

        由客户端生成一些随机值和不可逆的MD5加密字符串,并在发起请求时将这些值发送给服务器端。服务器端使用相同的方式对随机值进行计算以及MD5加密,如果服务器端得到的MD5值与前端提交的MD5值相等,就代表是正常请求,否则返回403。

3.4.反爬虫绕过方法

        大部分签名验证反爬虫的请求,其正文信息计算是使用javascript进行的,因此我们需要找到该网站引入的JavaScript文件。通过搜索的方式快速定位对应的代码、分析JavaScript文件的代码逻辑,并通过python实现,便能够请求到想要的数据了。

2.5.总结

        签名验证反爬虫的绕过主要就是通过编程语言模拟网站加载的javascript计算逻辑,根据网站内容的不同,难易程度也不一样。签名验证反爬虫是可行的,使用javascript生成随机字符串、多字段组合和加密等技术手段已经被应用在了大型网站的反爬虫方法中。典型的例子就是有道翻译


更新中…

猜你喜欢

转载自blog.csdn.net/qq_42506411/article/details/108040180