如何避免在网页爬取中因用户代理而被拒?

在执行数据爬取任务时使用正确的用户代理是避免被阻止而成功收集目标数据的关键,读完此文,你对网页爬取中的用户代理将有全面认识。
Chrome browser and web scraping to data collection
Josh Vanderwillik
Josh Vanderwillik | Product Manager
03-Dec-2020

此文将从以下几点讨论:

什么是用户代理?

用户代理简称 UA(User Agents),是Http协议中的一部分,属于标头的组成部分,指的是促进用户与网页内容交互时的任何软件,它是一个特殊字符串头,使得目标服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。在网络请求当中,用户代理是标明身份的一种标识,通过这个标识,用户所访问的网站使用此信息来调整对设备、操作系统和浏览器类型的响应从而为用户提供更好的体验或者进行信息统计。

我们来看几个例子

在如何选择用户代理方面并没有太大的一致性,但大多数浏览器以以下格式发送用户代理标头:

syntax for choosing a user agent - User-Agent: Mozilla/5.0 (<system-information.) <platform> (<platform-details>) <extensions> white text on grey background
用户代理: Mozilla/5.0 () ()

照片来源: Bright Data

每个浏览器都会添加自己的注释组件,例如平台或发布版本( RV) 。 Mozilla 提供了用于爬虫的字符串示例:

Crawler string example - white text on grey background - Mozilla/5.0 (compatible; Googlebot/2.1; +http:://www.google.com/bot.html
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

照片来源: Bright Data

你可以在Mozilla 开发者网站上学习到使用其浏览器时的不同字符串意义。

下面是 Chrome 开发者网站上找到有关用户代理字符串格式如何在不同设备和浏览器中的示例:

安卓系统的Chorme

手机的用户代理:

white text on grey background - user agent to collect data as a android linux device or some other mobile device such as an apple iphone
Mozilla/5.0 (Linux; ; )AppleWebKit/ (KHTML, like Gecko) Chrome/Mobile Safari/

照片来源: Bright Data

平板的用户代理:

White text on grey background - syntax for user-agent to appear as either android tablet or apple ipad
Mozilla/5.0 (Linux; ; )AppleWebKit/(KHTML, like Gecko) Chrome/Safari/

照片来源: Bright Data

为什么在数据爬取中要使用用户代理

为什么有些服务器会阻止某些用户代理而让另外的一些用户代理进行数据爬取呢? 有些目标网站明确表示不允许机器人爬虫或爬取工具,所以,一旦其将某些用户代理来源标识为机器人,就会阻止爬取;有些防范更严密的网站会以相反的方式执行此操作:它们只允许他们认为有效的用户代理执行爬取作业;防范最高级的网站会检查浏览器在其网页上的“行为”:是否与其声称的用户代理相匹配。

您可能认为正确的解决方案是不在请求中设置用户代理。 但是,这会导致爬取工具使用默认用户代理,大多数情况下,目标网页服务器会将其列入黑名单并加以阻止。

那么如何确保不会因为户代理而被禁止爬取呢?

避免在数据爬取时因用户代理被禁的几点专业建议:

#1: 使用真正的用户代理

如果您的用户代理不属于主要浏览器,某些网站将阻止其请求。许多基于机器人的网络爬虫跳过了定义用户代理的步骤,结果会被检查到没有默认的用户代理或错误的用户代理被禁止访问爬取。

解决方法是设置广泛使用的用户代理来避免此问题:点击这里找到大量流行的用户代理。您可以编译一个流行字符串列表并通过对网站执行 cURL 请求来轮换它们。尽管如此,还是建议您使用浏览器的用户代理,因为如果您不对其进行过多更改,您的浏览器行为更有可能与用户代理的预期相符,这样反而会更容易通过检测。

#2: 轮换用户代理

随机化网页爬取时发出的大量请求,这将最大限度地减少目标网页服务器识别和阻止您的用户代理的可能性。

如何随机化请求?

一种解决方案是使用轮换代理更改请求 IP 的地址,这样,您每次都发送一组不同的标头。在网页服务器端看来,请求是来自不同的计算机和不同的浏览器,因而不会阻止你的爬取请求。

专业提示:用户代理是标头之一,也就是说标头不仅仅包括用户代理。您不能只发送随机标头,您需要确保您发送的用户代理与您发送的标头匹配,这样才不会被检测到。

进入这里 botcheck.luminatio.io 查看您发送的标头是否与用户代理相符。

如何轮换用户代理

首先,您需要收集用户代理字符串列表,强烈建议使用来自真实浏览器的字符串,点击此处获得;下一步是将字符串添加到 Python 列表中;最后,定义每个从列表中选择的一个随机字符串请求。

您可以在此堆栈溢出讨论中看到如何使用 Python 3 和 Selenium 4 轮换用户代理的示例。

以下为代码示例:

white text on grey background coding environment, python code on how to rotate user agents照片来源: Bright Data

无论您选择使用哪种程序或方法来轮换您的用户代理标头,您都应该遵循相同的技术以避免被检测到从而遭到阻止:

  • 轮换与每个用户代理相关联的全套标头
  • 按照真实浏览器通常的顺序发送标头
  • 使用您访问过的上一页作为“引用标头”

专业提示:您需要确保在使用引用标头时 IP 地址和 cookie 不会更改。理想情况是访问上一页,以便在目标服务器上保有它的记录。

#3: 通过代理网络轮换用户代理

使用代理网络,可以避免你手动轮换用户代理以及自定义列表的麻烦。好的代理具有设置自动轮换IP和使用代理字符串的功能,这意味着您的请求看起来像是来自各种网页浏览器。这种自动设置功能可以大大减少阻塞并提高了成功率,因为​​这种设置让请求看起来是出自真实的网络用户。

值得注意的是,只有网页解锁技术非常好的代理才能正确管理和轮换您的用户代理:亮网络解锁器承诺100%网页成功解锁,且不成功不收费。

总结一下

大多数网站会阻止没有或标注了的浏览器用户代理的请求,因此如何正确轮换用户代理对于避免网站阻止访问非常重要,使用正确的用户代理是在向你的目标网站传递一个信息:你的请求是“正常”的,这样你才能从目标网站自由收集数据。

Josh Vanderwillik
Josh Vanderwillik | Product Manager

Josh is a product manager at Bright Data working on next-gen technology,
specifically in the field of automated data collection: building fingerprint-proof, high
scale web crawlers that are simple to use. He is an active participant in global
webinars which help companies learn cutting edge data collection techniques, and
is now expanding that knowledge base through blogging.