什么是用户代理(UA): 如何设置用户代理抓取网页

在网络抓取时使用不正确的用户代理或不应用一些相关的最佳实践是被反机器人阻止的秘诀。为了解决这个问题,您可以在此处找到用于抓取的最佳用户代理列表以及使用它们的一些技巧。

什么是用户代理?

用户代理 (UA) 是用户的 Web 浏览器在 HTTP 标头中发送到 Web 服务器的字符串,用于识别正在使用的浏览器类型、版本和操作系统。使用属性在客户端通过 JavaScript 访问navigator.userAgent,远程 Web 服务器使用此信息以与所使用的设备和浏览器兼容的方式识别和呈现内容。

虽然包含不同的结构和信息,但大多数网络浏览器倾向于遵循相同的格式

Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>

例如,Chrome (Chromium) 的用户代理字符串可能是Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36. 请注意,它包含浏览器的名称 (Chrome)、版本号 (109.0.0.0) 和浏览器运行的操作系统(Windows NT 10.0,64 位处理器)。

为什么用户代理对于网页抓取很重要?

由于 UA 字符串可帮助 Web 服务器识别所请求的浏览器(和机器人)的类型,因此使用用户代理列表进行抓取有助于将您的抓取工具伪装成 Web 浏览器。

请注意,使用错误格式的用户代理会阻止您的数据提取脚本

什么是抓取的最佳用户代理?

我们编制了一份最佳网络抓取用户代理列表,用于模拟浏览器并避免被阻止:

  • Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/109.0.0.0 Safari/537.36
  • Mozilla/5.0(Macintosh;Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/109.0.0.0 Safari/537.36
  • Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/108.0.0.0 Safari/537.36
  • Mozilla/5.0(Macintosh;Intel Mac OS X 10_15_7)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/108.0.0.0 Safari/537.36
  • Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
  • Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
  • Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15

如何检查用户代理并理解它们

检查当前抓取用户代理的最简单方法是访问UserAgentString.com。它会自动显示您的 Web 浏览环境的用户代理,您可以获得有关其他用户代理的全面信息。为此,在输入字段中复制/粘贴任何字符串,然后单击“分析”。

user-agent-string

如何在 Python 中设置新的用户代理标头?

让我们运行一个使用 Python 请求更改 scraper 用户代理的快速示例。我们将使用与 Chrome 关联的字符串:

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36

使用以下代码片段User-Agent在使用 Python 发送请求时设置标头:

import requests 
 
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"} 
 
# You can test if your web scraper is sending the correct header by sending a request to HTTPBin 
r = requests.get("https://httpbin.org/headers", headers=headers) 
print(r.text)

请求的输出将如下所示:

{ 
    "headers": { 
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Host": "httpbin.org", 
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", 
        "X-Amzn-Trace-Id": "Root=1-63c42540-1a63b1f8420b952f1f0219f1" 
    } 
}

就是这样!您现在有一个用于抓取的新用户代理。

如何避免让您的 UA 被禁止

虽然使用用户代理进行网络抓取可以减少被阻止的机会,但从同一个用户代理发送过多请求会触发反机器人系统,最终阻止您的抓取程序。避免这种情况的最佳方法是使用浏览器用户代理,轮流浏览用户代理列表以进行抓取并使它们保持最新。

1.轮换用户代理

轮换抓取用户代理只是在发出 Web 请求时更改 UA,让您访问更多数据并提高抓取器的效率。此方法可以帮助保护您的 IP 地址不被阻止和列入黑名单。

如何轮换用户代理

要轮换它们,首先要获取用于抓取的用户代理列表。您可以从WhatIsMyBrowser获得一些真实的。

我们将使用这 3 个浏览器 UA 字符串并将它们放入 Python 中list()

user_agent_list = [ 
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', 
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15', 
]

使用for循环并random.choice()从中选择一个随机的刮板用户代理list()

for i in range(1,4): 
    user_agent = random.choice(user_agent_list)

设置 UA 头,然后发送请求:

headers = {'User-Agent': user_agent} 
response = requests.get(url, headers=headers)

完整代码如下所示:

import requests 
import random 
 
user_agent_list = [ 
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', 
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15', 
] 
 
url = 'https://httpbin.org/headers' 
for i in range(1, 4): 
    user_agent = random.choice(user_agent_list) 
    headers = {'User-Agent': user_agent} 
    response = requests.get(url, headers=headers) 
    received_ua = response.json()['headers']['User-Agent'] 
 
    print("Request #%dnUser-Agent Sent: %snUser-Agent Received: %sn" % (i, user_agent, received_ua))

这是运行请求后的输出:

Request #1 
User-Agent Sent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 
User-Agent Received: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 
 
Request #2 
User-Agent Sent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 
User-Agent Received: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 
 
Request #3 
User-Agent Sent: Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15 
User-Agent Received: Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15

2.保持请求之间的随机间隔

在请求之间保持随机间隔,以防止您的网络抓取工具被检测到和阻止。

您可能有兴趣阅读我们关于如何在网络抓取时绕过速率限制的指南。

3.使用最新的用户代理

为了保持您的网络抓取顺畅且不间断,请确保定期更新您的抓取器用户代理,因为过时的用户代理可能会阻止您的 IP。

结论

Web 抓取中的用户代理可让您模仿 Web 浏览器的行为,帮助您以用户身份访问网站,以便在不被阻止的情况下抓取网页

在本文中,我们分享了一些最好的 UA 字符串和技巧。下面是关于如何在网络抓取中使用这些用户代理的回顾:

  • 轮换您的用户代理以避免机器人检测。
  • 在请求之间保持随机间隔。
  • 保持你的用户代理更新。

现代网站使用不同的反抓取技术来检测网络抓取机器人。使用最好的抓取用户代理可以降低被阻止的风险,但它可能并不总是有效。为了避免不确定性和麻烦,许多人使用网络抓取 API。

类似文章