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 等工具到法律注意事项,了解如何应对挑战、绕过验证码并高效提取有价值的见解。

Suciu Dan
作者头像
Suciu Dan
15 分钟阅读
缩图
使用案例在金融领域利用网络抓取另类数据:投资者综合指南

探索网络搜索在金融领域的变革力量。从产品数据到情感分析,本指南深入介绍了可用于投资决策的各类网络数据。

米赫内亚-奥克塔维安-马诺拉什
作者头像
米赫内亚-奥克塔维安-马诺拉什
13 分钟阅读
缩图
使用案例释放金融数据的力量:探索传统和替代数据

深入了解财务数据在商业决策中的变革作用。了解传统财务数据和替代数据的新兴意义。

Suciu Dan
作者头像
Suciu Dan
8 分钟阅读