HTTP 标头 101:如何使用它们进行有效的网络抓取
Raluca Penciuc,2023 年 2 月 3 日

网络搜索是从互联网上提取有价值信息的绝佳工具,但实事求是地说,当你的搜索脚本被阻止时,你会感到非常沮丧。
这就像一场猫捉老鼠的游戏,网站所有者总是想出新的办法把你拒之门外。不过,你的工具箱里有一件秘密武器可以让你占上风:HTTP 标头和 Cookie。
这两个要素对您的刮擦脚本如何与网站交互起着至关重要的作用,掌握这两个要素意味着刮擦受阻与刮擦成功之间的差别。
在本教程中,我们将揭开 HTTP 标头和 Cookie 的秘密,并向您展示如何使用它们使您的刮擦工作尽可能像人一样。
您将了解网络搜刮中最常用的头信息,如何从真实浏览器中抓取头信息和 cookie,以及如何使用自定义头信息绕过安全措施。那么,让我们深入学习,看看如何将我们的搜刮游戏提升到一个新的水平!
了解 HTTP 标头
HTTP 标头是作为 HTTP 请求或响应的一部分发送的键值对。它们之间用冒号和空格隔开,其名称(键)不区分大小写。
您可以根据 HTTP 标头的功能和发送方向,将其分为不同的类别。这些类别包括
- 常规标头:适用于请求和响应信息
- 请求标头:包含更多关于要获取的资源或发出请求的客户端的信息
- 响应标头:保存有关响应的附加信息,如位置或提供响应的服务器
- 实体标头:包含有关资源主体的信息,如大小或 MIME 类型
- 扩展头:用于提供向后兼容性
HTTP 头信息提供了广泛的信息,包括您发出的请求类型、您使用的浏览器以及服务器处理请求所需的任何其他信息。
它们还允许你提供身份验证和安全信息,控制缓存和压缩,以及指定请求的语言和字符集。
例如,以下是 Chrome 浏览器访问 youtube.com 时发送的报头:
:authority: www.youtube.com
:method: GET
:path: /
:scheme: https
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-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cache-control: no-cache
pragma: no-cache
referer: https://www.google.com/
sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"
sec-ch-ua-arch: "x86"
sec-ch-ua-bitness: "64"
sec-ch-ua-full-version: "109.0.5414.75"
sec-ch-ua-full-version-list: "Not_A Brand";v="99.0.0.0", "Google Chrome";v="109.0.5414.75", "Chromium";v="109.0.5414.75"
sec-ch-ua-mobile: ?0
sec-ch-ua-model: ""
sec-ch-ua-platform: "Windows"
sec-ch-ua-platform-version: "15.0.0"
sec-ch-ua-wow64: ?0
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
x-client-data: CIm2yQEIorbJAQjEtskBCKmdygEI5PDKAQiWocsBCKr2zAEI7oLNAQibiM0BCLqIzQEI9YjNAQ==
Decoded:
message ClientVariations {
// Active client experiment variation IDs.
repeated int32 variation_id = [3300105, 3300130, 3300164, 3313321, 3324004, 3330198, 3357482, 3359086, 3359771, 3359802, 3359861];
}
了解网络 cookie
网络 cookie 或HTTP cookie 是网站存储在用户浏览器上的小文本文件。此后,用户每次向网站发送新请求时,cookie 都会自动包含在内。
它们是唯一可识别的,您可以通过以下方式找到它们:
- 会话 cookie:它们是临时的,在用户关闭浏览器时失效
- 持久 Cookie:它们有特定的失效日期,会一直保留在用户设备上,直到失效或被用户删除。
网站使用网络 cookie 个性化用户体验。这可能包括记住用户的登录信息和存储购物车内容,以了解用户与网站的互动方式,并提供有针对性的广告。
这里也以 youtube.com 为例,我们可以注意到 cookie 存储的内容:
cookie:CONSENT=YES+srp.gws-20210816-0-RC3.ro+FX+801; __Secure-3PAPISID=jG4abs_wYhyzcDG5/A2yfWlePlb1U9fglf; VISITOR_INFO1_LIVE=pJuwGIYiJlE;__Secure-3PSIDCC=AEf-XMRV_MjLL0AWdGWngxFHvNUF3OIpk3_jdeUwRiZ76WZ3XsSY0Vlsl1jM9n7FLprKTqFzvw; __Secure-3PSID=RAi8PYLbf3qLvF1oEav9BnHK_eOXwimNM-0xwTQPj1-QVG1Xwpz17T4d-EGzT6sVps1PjQ.; YSC=4M3JgZEwyiA; GPS=1; DEVICE_INFO=ChxOekU1TURJMk1URTBOemd5TWpJeU5qVTJOdz09EOvgo54GGOvgo54G; PREF=tz=Europe.Bucharest&f6=40000000&f4=4000000; CONSISTENCY=ACHmjUr7DnoYSMf5OL-vaunKYfoLGz1lWYRUZRepFyIBDRpp_jrEa85E4wgRJLJ2j15l688hk9IVQu7fIjYXo7sdsZamArxVHTMuChgHd22PkX_mbfifnMjyp4OX2swyQJRS-8PE6cOCt_6129fGyBs;amp_adc4c4=Ncu7lbhgeiAAYqecSmyAsS.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn4emd4v.1gn4en556.0.4.4
标题和 cookie 在网络搜刮中的重要性
在网络搜刮中,您可以使用标头和 cookie 绕过安全措施,访问受限制的内容,并提供有助于将您的搜刮脚本识别为合法浏览器的信息。
例如,通过指定正确的 User-Agent 标头(更多详情将在下一节中介绍),可以让脚本看起来像是 Chrome 浏览器,从而避免被网站检测到。
此外,通过存储和发送 cookie,您的 scraper 可以访问只有登录用户才能访问的内容。由于网站使用 cookie 来提供有针对性的广告,因此您也可以使用 cookie 来提取更准确的数据并更好地了解网站。
除了使用 HTTP 标头和 Cookie 外,还可以考虑本指南中列出的一些非常有用的网络搜刮最佳实践。
网络搜索中常用的标头
有许多不同的标头可用于网络搜刮,但其中最常用的标头有
用户代理
它用于识别发出请求的客户端所使用的浏览器和操作系统。服务器使用此信息来确定客户使用的浏览器和操作系统,以便提供适当的内容和功能。
User-Agent 字符串包含浏览器名称、版本和平台等信息。例如,Windows 系统上 Google Chrome 浏览器的 User-Agent 字符串可能如下所示:
用户代理: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,可以使脚本显示为合法用户常用的浏览器,从而降低被拦截的可能性。
接受
它用于指定浏览器在响应 HTTP 请求时愿意接受的内容类型,如文本、图像、音频或视频。接受 "标头可以如下所示:
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
在网络搜刮中,通过指定正确的 Accept 标头,可以确保脚本接收到正确的数据。例如,如果你想抓取 HTML 网页,可以指定 Accept 标头为text/html。
不过,有些网站会利用这个标题来检测刮擦程序,因此一定要谨慎使用,只有在必要时才使用。
接受语言
该标头指定了浏览器在响应 HTTP 请求时愿意接受的内容首选语言。服务器使用 Accept-Language 标头来决定向客户端发送哪种语言。
浏览器在请求一个英文 HTML 页面时,可能会发送一个 Accept-Language 标头,看起来像这样:
Accept-Language: en-US,en;q=0.9
饼干
网站在客户端提出请求后,会使用该标头向客户端发送 Cookie。Cookie 标头可能如下所示:
Cookie: session_id=1234567890; user_id=johndoe
在网络搜刮中,您可以使用该标头传递会话 cookie,访问只有登录用户才能访问的内容。另一个用例是使用持久 Cookie 获取个性化结果。
推荐人
该标头指定了链接到当前页面的前一个网页的 URL。服务器使用它来跟踪请求的来源,并了解请求的上下文。
例如,如果用户点击了从一个网页到另一个网页的链接,浏览器就会向第二个网页发送请求,并在 Referer 标头中包含第一个网页的 URL。因此,向第二个网页发出的请求的 Referer 头信息如下所示:
Referer: https://www.example.com/
在网络搜刮中,您可以使用 Referer 标头访问不允许直接请求的网站。
从真实浏览器读取页眉和 cookie
不过,理论讲得够多了。让我们看看如何提取发送到网站的 HTTP 头信息和网络 cookie。
回到我们的示例,在真实浏览器中导航到 youtube.com。然后右键单击页面上的任意位置,选择 "检查 "选项。打开 "开发工具 "后,转到 "网络 "选项卡。

刷新页面后,你会看到请求正在实时加载。点击第一个(也是主要的)请求,就会出现一个附加选项卡。

在这里,您可以看到发送请求的所有详细信息:URL、方法、状态代码、远程地址,以及最重要的:我们正在查找的请求和响应头。
在网络搜刮中使用自定义标题
- 使用 httpbin.org 显示浏览器发送的标头
- 选择一种编程语言,发送一个基本的 GET 请求,查看标头
- 传递您抓取的自定义标头
- 重复 node.js 和 python 的处理过程
- 重写 WSA 部分
- 链接到 API 文档
- 描述自定义标头的功能
现在,让我们看看如何利用这些标头来改进我们的刮擦程序。在这一部分,我们将以一个简单的镜像网站为例,它将直接显示我们发送的头信息:https://httpbin.org/headers。

复制 "headers "对象的内容,然后开始编写代码。
Node.js
在确保 Node.js 环境设置正确和项目初始化后,运行以下代码:
import got from 'got';
(async () => {
const response = await got('https://httpbin.org/headers')
console.log(response.body)
})()
这样我们就能看到最基本的 GET 请求是怎样的了。结果应该是
{
"headers": {
"Accept-Encoding": "gzip, deflate, br",
"Host": "httpbin.org",
"User-Agent": "got (https://github.com/sindresorhus/got)",
"X-Amzn-Trace-Id": "Root=1-63c93ff5-0c352d6319620b3d6b46df02"
}
}
这看起来与我们在浏览器中看到的截然不同。仅凭 User-Agent 就能让服务器轻松检测出请求是自动发出的。
现在,让我们传递自定义标头,再次发送请求:
import got from 'got';
(async () => {
const custom_headers = {
"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-Encoding": "gzip, deflate, br",
"Accept-Language": "en-US,en;q=0.9",
"Cache-Control": "no-cache",
"Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",
"Host": "httpbin.org",
"Pragma": "no-cache",
"Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": "\"Windows\"",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"
}
const response = await got('https://httpbin.org/headers', {
headers: custom_headers
})
console.log(response.body)
})()
再次运行脚本,你会发现现在我们的请求看起来像是从一个真正的 Chrome 浏览器发出的,尽管我们并没有打开一个真正的 Chrome 浏览器。
Python
现在,让我们用 Python 来做同样的事情。虽然语法和库不同,但原理是一样的。
import requests
url = 'https://httpbin.org/headers'
headers = {
"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-Encoding": "gzip, deflate, br",
"Accept-Language": "en-US,en;q=0.9",
"Cache-Control": "no-cache",
"Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",
"Host": "httpbin.org",
"Pragma": "no-cache",
"Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": "\"Windows\"",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"
}
response = requests.get(url, headers=headers)
print(response.text)
无论使用哪种编程语言,运行脚本后的结果都是一样的。
WebScrapingAPI 中的自定义标题
任何值得信赖的刮擦 API 都应提供向请求传递自定义 HTTP 标头和Cookie的强大功能。标准可能因 API 而异,因此请务必先查阅官方文档。
默认情况下,WebScrapingAPI 会为每个请求提供一组自定义头信息。随机 User-Agent 标头只是其中一个例子。
不过,由于网站可能会变得格外复杂或简单过时,您可以自由禁用此行为,并完全自定义您的请求。只需确保先获取一个 API 密钥,然后运行以下代码即可:
import got from 'got';
(async () => {
const response = await got("https://api.webscrapingapi.com/v1", {
searchParams: {
api_key: "YOUR_API_KEY",
url: "https://httpbin.org/headers",
keep_headers: '0',
},
headers: {
"Wsa-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",
"Wsa-Accept-Encoding": "gzip, deflate, br",
"Wsa-Accept-Language": "en-US,en;q=0.9",
"Wsa-Cache-Control": "no-cache",
"Wsa-Cookie": "amp_d915a9=sd12OA1w0P4xMKsMYSmY9n.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1ggrl757h.1ggrl75ci.0.1o.1o; amp_adc4c4=P3ZIfUgU8qzSHI-y0gZvbk.MXVDWTJjd3BXdmRkQ3J0YUpuTkx3OE5JcXVKMw==..1gn51hk3v.1gn51lql7.0.e.e",
"Wsa-Pragma": "no-cache",
"Wsa-Sec-Ch-Ua": "\"Not_A Brand\";v=\"99\", \"Google Chrome\";v=\"109\", \"Chromium\";v=\"109\"",
"Wsa-Sec-Ch-Ua-Mobile": "?0",
"Wsa-Sec-Ch-Ua-Platform": "\"Windows\"",
"Wsa-Sec-Fetch-Dest": "document",
"Wsa-Sec-Fetch-Mode": "navigate",
"Wsa-Sec-Fetch-Site": "none",
"Wsa-Sec-Fetch-User": "?1",
"Wsa-Upgrade-Insecure-Requests": "1",
"Wsa-User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
"Wsa-X-Amzn-Trace-Id": "Root=1-63c93e34-1ad0141279d49bfc28fb058e"
}
})
console.log(response.body)
})()
在这种情况下,根据 API 文档,我们必须在标头名称后附加 "Wsa-"前缀,才能将其传递给请求。采取这一措施是为了防止无意中传递头信息,比如从浏览器发送 API 请求时。
结论
本文概述了 HTTP 标头和网络 cookie 在网络刮擦中的重要性和使用方法。
我们已经讨论了什么是标头和 Cookie,如何使用它们访问受限内容,如何让你的搜刮脚本看起来像一个合法的浏览器,以及如何使用它们进行跟踪和分析。
我们还介绍了网络搜刮中常用的一些标头,并解释了如何从真实浏览器中检索标头和 cookie。然后,我们使用代码示例来说明如何在你的搜刮脚本中使用它们。
通过了解并有效使用标头和 Cookie,你可以提高网络搜刮工作的效率。有了这些知识,你就能将自己的网络搜索技能提升到一个新的水平,并从网络中提取有价值的信息。
新闻和更新
订阅我们的时事通讯,了解最新的网络搜索指南和新闻。
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

相关文章

通过我们的深入指南,探索刮擦亚马逊产品数据的复杂性。从最佳实践和亚马逊 Scraper API 等工具到法律注意事项,了解如何应对挑战、绕过验证码并高效提取有价值的见解。




