反爬虫——精选推荐

反爬虫——精选推荐

2023年6月29日发(作者:)

反爬⾍⼀、前置知识1. 动态⽹页和⽹页源码在爬⾍领域中,静态⽹页与动态⽹页的定义与传统定义是完全不同的。静态⽹页指的是⽹页主体内容的渲染⼯作在服务器端完成,并通过响应正⽂返回的⽹页。动态⽹页指的是主体内容或者全部内容都需要客户端执⾏ JavaScript 代码来计算或渲染的⽹页。⽹页源码,是指未经过浏览器解释和 JavaScript 引擎渲染的⽂本,它的⽂本内容与 HTML 原⽂中的内容是相同的。爬⾍需要通过⽹络请求的⽅式获取资源。在得到的资源的过程中,由于 Python、 Java 和 PHP等编程语⾔没有 JavaScript 解释器和渲染引擎,所以使⽤编程语⾔编写的爬⾍程序⽆法渲染页⾯,它们只能爬取响应正⽂中的内容,也就是⽹页源代码中的内容。如果想要爬取动动态⽹页中的数据,那么就需要借助 JavaScript 解释器和渲染引擎将渲染后的⽹页代码以⽂本的形式传给爬⾍。有⼀些⼯具已经集成了渲染页⾯所需的组件,并且开放 API 允许编程语⾔操作页⾯以获取渲染后的页⾯代码。爬⾍⼯程师常⽤的渲染⼯具如下。Splash:异步的 JavaScript 渲染服务。Selenium:⾃动化测试框架。Puppeteer:⼀个通过 DevTools 协议控制 Chrome 的 Node js库。2. 爬⾍爬⾍指的是按照⼀定规则⾃动抓取⽹络信息的程序,分为通⽤爬⾍和聚焦爬⾍两⼤类,前者的⽬标是在保持⼀定内容质量的情况下爬取尽可能多的站点;⽽后者的⽬标则是在爬取少量站点的情况下尽可能保持精准的内容质量。爬⾍通常从⼀个或多个 URL 开始,在爬取的过程中不断将新的并且符合要求的 URL 放⼈待爬队列,直到满⾜程序的停⽌条件。爬⾍的的爬取过程可以分为下⾯3个步骤。(1)请求指定的 URL 以获取响应正⽂。(2)解析响应正⽂内容并从中提取所需信息。(3)将上⼀步提取的信息保存到数据库或⽂件中。

⼆、反爬⾍爬⾍程序的访问速率和⽬的与正常⽤户的访间速率和⽬的是不同的,⼤部分爬⾍会⽆节制地对⽬标应应⽤进⾏爬取,这给⽬标应⽤的服务器带来巨⼤的压⼒。爬⾍程序发出的⽹络请求被运营者称为“垃圾流量”。限制爬⾍程序访问服务器资源和获取数据的⾏为称为反爬⾍。限制⼿段包括但不限于请求限制、拒绝响应、客户端⾝份验证、⽂本混淆和使⽤动态渲染技术。这些限制根据出发点可以分为主动型反爬⾍和被动型反爬⾍。主动型反爬⾍:开发者有意识地使⽤技术⼿段区分正常⽤户和爬⾍,并限制爬⾍对⽹站的访问⾏为,如验证请求头信息、限制访问频率、使⽤验证码等。被动型反爬⾍:为了提升⽤户体验或节省资源,⽤⼀些技术间接提⾼爬⾍访问难度的⾏为,⽐如数据分段加载、点击切换标签页、⿏标悬停预览数据等。除此之外,还可以从特点上对反爬⾍进⾏更细致的划分,如信息校验型反爬⾍、动态渲染型反爬⾍、⽂本混淆型反爬⾍、特征识别型反爬⾍等。

三、信息校验型爬⾍信息校验中的“信息”指的是客户端发起⽹络请求时的请求头和请求正⽂,⽽“校验”指的是服务器端通过对信息的正确性、完整性或唯⼀性进⾏验证或判断,从⽽区分正常⽤户和爬⾍程序的⾏为。1. User-Agent 反爬⾍User-Agent 是请求头域之⼀,服务器从 User-Agent 对应的值中识别客户端的使⽤信息。User-Agent 的⾓⾊就是客户端的⾝份标识。服务器可以使⽤⿊名单结合条件判断实现针对性较强的反爬⾍。除了 User-Agent 之外,可利⽤的头域还有 Host 和 Referer。这种验证请求头信息中特定头域 的⽅式既可以有效地屏蔽长期⽆⼈维护的爬⾍程序,也可以将⼀些爬⾍初学者发起的⽹络请求拒之门 外,但是对于⼀些经验丰富的爬⾍⼯程师,或许还需要更巧妙的反爬⾍⼿段。

2. Cookie 反爬⾍Cookie 反爬⾍指的是服务器端通过校验请求头中的 Cookie 值来区分正常⽤户和爬⾍程序的⼿段,也可以把 Cookie 和 JavaScript 结合起来实现反爬⾍,提⾼爬⾍难度,这种⼿段被⼴泛应⽤在 Web 应⽤中。例如,在 HTML 代码中引⼊⼀个可以将浏览器重定向到⽬标页⾯的 JavaScript ⽂件,并且在这个⽂件中实现随机字符串⽣成和 Cookie 设置的功能,那么服务器端只需要校验 Cookie 值的规则即可。避免了通过将 Cookie 值从浏览器的请求头中复制,就可以⼀直使⽤这个简单的⽅法。User-Agent 和 Cookie 都是请求头的默认头域,在值的设定⽅⾯有⼀定的局限性,但是与JavaScript 结合后,就会变得很灵活。相对服务器软件来说,后端程序的校验更为灵活且准确,但使⽤后端程序进⾏校验所需的步骤较多,在实际应⽤时可以根据需求选择合适的校验⽅式。

3. 签名验证反爬⾍签名是根据数据源进⾏计算或加密的过程,签名的结果是⼀个具有唯⼀性和⼀致性的字符串。签名结果的特性使得它成为验证数据来源和数据完整性的条件,可以有效避免服务器端将伪造的数据或被篡改的数据当成正常数据处理。签名验证是防⽌恶意连接和数据被篡改的有效⽅式之⼀,也是⽬前后端 API 最常⽤的防护⽅式之 ⼀。与 Cookie、User-Agent 请求头域不同,⽤于签名验证的信息通常被放在请求正⽂中发送到服务器端。签名验证反爬⾍利⽤ JavaScript ⽣成随机值,与之前的随机值不同,这次的随机值中包含时间戳和 MD5 加密值。签名验证有很多种实现⽅式,但原理都是相同的:由客户端⽣成⼀些随机值和不可逆的 MD5 加密字符串,并在发起请求时将这些值发送给服务器端。服务器端使⽤相同的⽅式对随机值进⾏ 计算以及 MD5 加密,如果服务器端得到的 MD5 值与前端提交的 MD5 值相等,就代表是正常请求, 否则返回403。

4. WebSocket 握⼿验证反爬⾍WebSocket 握⼿时使⽤的协议是 HTTP 协议,所有基于 HTTP 协议的反爬⾍都可以⽤在 WebSocket 协议上。客户端按照 WebSocket 规范⽣成握⼿信息并向服务器端发送握⼿请求,然后读取服务器端推送的消息,最后验证握⼿结果。WebSocket 协议规范只作为参考,服务器端和客户端实际上可以不遵守这些约定。⽐如服务器端可以在校验握⼿信息时增加对客户端 User-Agent 或 Referer 的验证,如果客户端发送的握⼿请求中并没有对应的信息,则拒绝连接。想要实现这个功能,只需要 在服务器端的代码中增加相关的信息验证代码即可。

5. WebSocket 消息校验反爬⾍如果握⼿验证成功,双端就可以开始互推消息了。WebSocket 只需要完成 1 次握⼿,就可以保持长期连接,在后续的消息互发阶段是不需要⽤到 HTTP 协议的,那么如何在 WebSocket 通信过程中实现反 爬⾍呢?其实消息互发阶段也是可以对客户端⾝份进⾏校验的,这是因为客户端所获取的消息是由服务器端主动推送的,如果服务器端不主动推送,那么客户端就⽆法获取消息。我们可以在服务器端新增⼀个校验逻辑:握⼿结束后客户端发送特定的消息,服务器端对该消息进⾏校验,校验通过则将服务器端的数据推送给客户端,否则不作处理。

6. WebSocket Ping 反爬⾍WebSocket 是可以保持长期连接的。但是服务器端不可能保持所 有客户端永久连接,这太耗费资源了,有没有⼀种办法可以检查客户端的状态呢?WebSocket 协议规范中约定,服务器端可以向客户端发送 Ping 帧,当客户端收到 Ping 帧时应当回复 Pong 帧。如果客户端不回复或者回复的并不是 Pong 帧,那么服务器端就可以认为客户端异常,主动关闭该连接。通常,Ping 帧和 Pong 帧的 Payload Data 中是没有内容的,所以只要⽬标服务器发送 Ping 帧时,客户端回复没有任何内容的 Pong 帧即可。WebSocket 协议中的规范并不强制遵守,所以开发者可以⾃定义 Ping 帧和 Pong 帧,这就为反爬⾍提供了条件。假如开发者在编写服务器端代码时,将 Ping 帧定义为有⼀定内容的数据帧,同时对 Pong 帧的 Payload Data 进⾏校验,就可以将不符合规则的连接关闭。

四、动态渲染反爬⾍由 JavaScript 改变 HTML DOM 导致页⾯内容发⽣变化的现象称为动态渲染。很多时候开发者只是想完成某个交互功能,⽽不是特意区分正常⽤户和爬⾍程序,但这在不经意间限制了爬⾍对数据的获取。由于编程语⾔没有像浏览器⼀样内置JavaScript解释器和渲染引擎,所以动态渲染是天然的反爬⾍⼿段。1. ⾃动执⾏的异步请求异步请求能够减少⽹络请求的等待时间,从⽽提升⽹页加载速度。为了追求⽤户体验、提升⽹站加载速度和减少⽤户等待时间,开发者会将内容较多的综合信息页⾯拆分成多个部分,然后使⽤异步请求的⽅式获取资源。

2. 点击事件和计算点击事件指的是⽤户在浏览⽹页的过程中使⽤⿏标点击按钮或标签等页⾯元素的操作,这类事件通常会与⼀个 JavaScript ⽅法绑定到⼀起,当事件触发时浏览器就会执⾏事件绑定的⽅法。这⾥提到的计算是指使⽤ JavaScript 计算数值并将结果渲染到⽹页。开发者使⽤ JavaScript 计算数据有可能是为了反爬⾍,也有可能是为了提⾼⽤户体验,因为客户端本地的计算速度远远超过⽹络请求的速度。

3. 下拉加载和异步请求⽹页中下拉加载实际上是⼀种翻页操作,当我们点击下⼀页或指定页码按钮的时候,浏览器会跳转到对应页码,这个跳转造成了页⾯的刷新,也就是向其他页⾯发起请求。⽽下拉加载通过异步请求和局部渲染避免刷新整个页⾯,局部渲染既避免了重复请求资源,⼜减少了⽤户等待的时间,这对于⽹站来说是⼀件很有意义的事。

五、⽂本混淆反爬⾍⽂本混淆可以有效地避免爬⾍获取 Web 应⽤中重要的⽂字数据,使⽤⽂本混淆限制爬⾍获取⽂字数据的⽅法称为⽂本混淆反爬⾍。反爬⾍的前提是不能影响⽤户正常浏览⽹页和阅读⽂字内容,直接混淆⽂本很容易被看出来,所以开发者通常是利⽤ CSS 的特性来实现混淆。1. 图⽚伪装反爬⾍图⽚伪装指的是将带有⽂字的图⽚与正常⽂字混合在⼀起,以达到“鱼⽬混珠”的效果。这种混淆⽅式并不会影响⽤户阅读,但是可以让爬⾍程序⽆法获得“所见”的⽂字内容。

2. CSS偏移反爬⾍CSS 偏移反爬⾍指的是利⽤ CSS 样式将乱序的⽂字排版为⼈类正常阅读顺序的⾏为。例如:HTML ⽂本中的⽂字:我的学号是 1308205,我在北京⼤学读书。浏览器显⽰的⽂字:我的学号是 1380205,我在北京⼤学读书。爬⾍提取到的学号是 1308205,但⽤户在浏览器中看到的却是 1380205。如果不细⼼观察,爬⾍⼯程师很容易被爬取结果糊弄。这种混淆⽅法和图⽚伪装⼀样,是不会影响⽤户阅读的。

3. SVG映射反爬⾍SVG 是⽤于描述⼆维⽮量图形的⼀种图形格式。它基于 XML 描述图形,对图形进⾏放⼤或缩⼩操作都不会影响图形质量。⽮量图形的这个特点使得它被⼴泛应⽤在 Web ⽹站中。这种反爬⾍⼿段⽤⽮量图形代替具体的⽂字,不会影响⽤户正常阅读,但爬⾍程序却⽆法像读取⽂字那样获得 SVG 图形中的内容。由于 SVG 中的图形代表的也是⼀个个⽂字,所以在使⽤时必须在后端或前端将真实的⽂字与对应的 SVG 图形进⾏映射和替换,这种反爬⾍⼿段被称为 SVG 映射反爬⾍。

4. 字体反爬⾍在 CSS3 之前,Web 开发者必须使⽤⽤户计算机上已有的字体。但是在 CSS3 时代,开发者可以使⽤ @font-face 为⽹页指定字体,对⽤户计算机字体的依赖。开发者可将⼼仪的字体⽂件放在 Web 服务器上,并在 CSS 样式中使⽤它。⽤户使⽤浏览器访问 Web 应⽤时,对应的字体会被浏览器下载到⽤户的计算机上。我们知道 CSS 的作⽤是修饰 HTML ,所以在页⾯渲染的时候不会改变 HTML ⽂档内容。由于字体的加载和映射⼯作是由 CSS 完成的,所以即使我们借助 Splash、Selenium 和 Puppeteer ⼯具也⽆法获得对应的⽂字内容。字体反爬⾍正是利⽤了这个特点,将⾃定义字体应⽤到⽹页中重要的数据上,使得爬⾍程序⽆法获得正确的数据。

结尾虽然反爬⾍措施有很多,但每⼀种都不是绝对安全的,爬⾍⾼⼿依旧可以绕过反爬⾍机制。在此之前也要做好⼀些基础的规则,⽐如说robots 协议或者⽤户协议等。如果你的⽹站被多进⾏⾼并发的程序被恶意爬⾍时,这已经不是单纯的爬⾍⾏为了,属于恶意破坏⽹络安全,必须要第⼀时间收集证据,⽤法律⼿段对抗那些⾮法的爬⾍⾏为。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1687981810a63432.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信