5种用于网络抓取的常见HTTP标头
您在抓取网页时再次被阻止了吗?很可能 HTTP 标头与此有关。在本指南中,您将了解如何优化您的请求以防止您的机器人被停止。对于那些不太熟悉该主题的人,我们将从头开始介绍所有内容。
Web 抓取中的 HTTP 标头是什么
标头是使用 HTTP 协议在客户端和服务器之间发送的键值对信息。它们包含有关请求和响应的数据,例如编码、内容语言和请求状态。
以下是用于网络抓取的最常见 HTTP 标头的列表:
Header | Sample value |
---|---|
User-Agent | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0 |
Accept-Language | en-US,en;q=0.5 |
Accept-Encoding | gzip, deflate, br |
Accept | text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 |
Referer | http://www.google.com/ |
HTTP 标头的类型
请求和响应包含不同的标头数据。让我们了解一下吧!
请求标头
在 HTTP 事务中,客户端(Internet 浏览器)发送请求标头。它用作请求源的标识符,并包含一些详细信息以帮助服务器了解客户端的功能并确定其响应。
例如,通过检查User-Agent
请求标头中的 ,服务器知道用户是否通过手机访问并提供网站的移动版本。查看下面的示例请求标头。
响应头
Web 服务器发送响应标头作为对客户端请求的答复。它通知用户主机对连接请求的回复,并包含请求状态、使用的连接类型、内容类型和编码格式等数据。此外,如果请求不成功,它将包含一个错误代码。
例如,我们在下面看到响应是使用Cloudflare提供的,这是一种流行的反机器人保护系统。
注意:您应该知道,网站还使用响应标头来设置唯一的身份验证 cookie。
由于我们可以修改的标头是请求的标头,因此我们将在本文中解决它们。
Web 抓取中的常见 HTTP 标头
对于网络抓取,一些常见的 HTTP 标头比其他标头更重要。接下来,我们将看到对我们的请求至关重要的那些。
1.用户代理
请求User-Agent
标头提供有关您的软件的基本信息,包括操作系统、您使用的浏览器及其版本等。
Mozilla/5.0 (Linux; Android 11; SAMSUNG SM-G973U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14.2 Chrome/87.0.4280.141 Mobile Safari/537.36
用户在上面的例子中使用了Android 11
and 。SamsungBrowser
Web 服务器使用User-Agent
标头来验证请求。通常,发送许多具有相同标头的邮件会使服务器怀疑您是机器人或从事可疑行为。
为避免被阻挡,旋转您的位置User-Agent
很重要。但是一个常见的错误是编写新的只是编辑 UA 的某些部分而不验证它们是否真实,这会将您标记为机器人。查看我们的最佳网络抓取用户代理列表可能会对您有所帮助。
2.接受语言
请求Accept-Language
标头用于告诉 Web 服务器客户端使用ISO 639-1 代码理解哪些语言以及准备响应的优先顺序。
Accept-Language: da, en-gb, en
在这种情况下,顺序是:丹麦语、英国英语、英语。
确保所选语言集与您要从域中提取的目标数据相匹配。此外,匹配 IP 位置和使用的语言可能会帮助您保持低调。
3.接受编码
请求Accept-Encoding
标头通知 Web 服务器在处理请求时使用哪种压缩算法。
Accept-Encoding: gzip, deflate, br
如果服务器支持,那将是双赢,因为您仍会收到所需的信息,只是采用压缩形式,这有助于您减少突出。同时,网站基础设施使用的资源更少。
4.接受
请求Accept
标头告知 Web 服务器可以返回给客户端的数据格式。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
忘记配置此标头或在网络抓取时没有正确配置是一个常见的错误,增加了被阻止的机会。
注意:您应该用“/”和逗号分隔所有文件类型和相应的格式。
5.推荐人
请求Referer
标头将之前访问过的网页传递给服务器。这可能看起来不重要,但它可能表示非人类行为并让您被阻止。
Referer: https://www.bbc.com/news/entertainment-arts-64759120
要模拟典型用户的浏览行为,请在开始会话之前指定一个随机网站Referer
,并记住为您的下一个请求设置它。这样做会增加刮板流量的有机外观。
其他相关的 HTTP 标头
在某些情况下,其他一些 Web 标头将有助于 Web 抓取,即使它们不如上面介绍的那些受欢迎。让我们看看其中的一些。
升级不安全请求
标Upgrade-Insecure-Requests
头要求服务器使用加密和经过身份验证的响应进行回复。如果您的爬虫在使用 SSL 时遇到任何困难,放弃此要求可能会有所帮助。
秒取
标Sec-Fetch
头提供有关请求的安全细节的信息。该网站可能会分析这些标头以识别网络抓取工具,因此如果您的配置错误,您可能会被阻止。
以下是一些有用的示例,以及它们在网络抓取中的各自用途:
- Sec-Fetch-Mode:指定请求的导航源。最好用于
navigate
直接请求和same-origin
/或cors
动态数据请求。 - Sec-Fetch-Site:表示请求的来源。您应该用于
none
直接请求和same-site
动态数据请求,例如 XHR 类型的请求。 - Sec-Fetch-Dest:表示请求的文档类型。它通常
document
用于直接 HTML 请求,对于动态数据请求为空。
请注意,这些是使用 HTTPS 网站时的默认值。
如何检查您的 HTTP 标头?
“我的 HTTP 标头是什么?”,您可能想知道。
您可以使用多种方法找出它们。我们将使用Scrape This Site充分利用浏览器的开发者工具:
- 打开一个新选项卡,单击鼠标右键,然后从下拉菜单中选择“检查”。
- 导航到“网络”选项卡。
- 通过将 URL 粘贴到顶部的地址栏来导航到该网站。您将在“网络”选项卡中看到浏览器和 Web 服务器之间的网络流量。
- 单击 HTML 文档中的第一个请求。
- 查看浏览器的标头。您将在右侧看到 HTTP 响应和请求标头列表。
现在您可以在发送请求时复制请求标头,以尽可能模仿真实用户。但要小心:像这样的标头cookie
包含会话/身份验证 cookie 以识别唯一用户,这可能会阻止您的爬虫。
您可以使用 Python 中的 Requests 模块并在 GET 请求中传递您的自定义标头。
import requests # store the headers as a dict headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br'} url = 'https://www.scrapethissite.com/' # use the `headers` argument to pass the custom headers resp = requests.get(url, headers=headers) # output the response's headers print(r.headers)
您可以在下面看到输出。
{'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'CF-Cache-Status': 'DYNAMIC', 'Report-To': '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=CFawwmM%2Belnz%2BG1FZcDw%2Fvj0O75hv4fhnjTYUN6hhXv%2Fx7sEmxmv18YPs7bug%2FboxFmhi73ODJKDPtqWtIMXLin2S51TowV4Add1hcbn53kEf8kWhRdeRJRwnP9OrQScI1XVOkoIHdLj"}], "group":"cf-nel","max_age":604800}', 'NEL': '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}', 'Server': 'cloudflare', 'CF-RAY': '791c3dabe8b19a1b-FRA', 'Content-Encoding': 'br', 'alt-svc': 'h3=":443"; ma=86400, h3-29=":443"; ma=86400'}
额外提示:当你完成会话时,你应该旋转你的标题,因为在没有旋转标题的情况下发出许多请求几乎每次都会让你被阻止。
为什么 HTTP 标头很重要?
在网络抓取方面,HTTP 请求标头至关重要,因为网站使用它们来确定访问者是否是网络抓取者。
许多网站跟踪和分析 HTTP 标头,因此错误的配置可能会阻止您的网络抓取工具。因此,使用唯一且合法的标头以被视为人类用户非常重要。
但是,当然,如果来自同一 IP 地址的请求过多,网站仍然可以阻止您。您可以使用代理服务器,它充当您的客户端和目标网站之间的中间人,因此一个很好的组合是使用旋转标头和旋转代理。查看我们关于在 Python 中旋转代理的教程以实现此技术!
结论
在网络抓取中,HTTP 请求标头包含识别客户端的信息。为避免被服务器检测到,轮换标头并使用代理隐藏您的 IP 地址是关键。
但设置起来可能相当具有挑战性。幸运的是,您可以省去麻烦并使用ZenRows成熟的网络抓取 API。它将为您实施这些技术,您可以免费试用。
常见问题
HTTP 标头应包含哪些内容?
HTTP 标头在控制请求和响应行为方面起着至关重要的作用。网络抓取时要包括的一些重要标头是:
- 用户代理。
- 接受。
- 推荐人。
- 曲奇饼。
- 缓存控制。
- 联系。
如何区分好的标头集和坏的标头集?
好的标头应该准确地将爬虫识别为真实用户。他们将提供必要的身份验证、HTTP cookie 和特定的通信选项。这将确保与目标服务器的有效通信。
如何有效使用 HTTP 标头?
在网络抓取时,您的 HTTP 标头应该与普通用户的相同,以尽量减少网络服务器的怀疑。
此外,Web 服务器可能会根据您的 IP 地址和 HTTP 标头应用速率限制。因此,如果您使用相同的 HTTP 标头发送过多请求,您可能会被暂时阻止。这就是为什么您应该使用代理服务器并经常更改 HTTP 标头的原因。
标题的顺序重要吗?
是的,标头的顺序是识别网络抓取工具的重要因素,因为编程语言中的许多 HTTP 客户端库都有自己的标头顺序。例如,Python 库 Request 不保留标头顺序,因此可以轻松检测到使用它的网络抓取工具。
HTTPX 库确实维护标头顺序,使其成为网络抓取的更安全选择。