🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

httpcloak网页抓取:Python中的全栈浏览器指纹

Michael Lee
Michael Lee

Expert Network Defense Engineer

22-Jul-2026

TL;DR:

  • httpcloak 是一个Python HTTP客户端,它在整个网络协议栈中模拟浏览器:TLS、HTTP/2、HTTP/3 和 TCP,而不仅仅是TLS握手。
  • 一个 httpcloak.get(url, preset="chrome-146") 调用同时展示浏览器的JA3、JA4和HTTP/2指纹,不需要浏览器进程。
  • 一个请求有多个指纹:由于GREASE,JA3哈希在每次运行时都会变化,而JA4和HTTP/2指纹保持不变。
  • httpcloak不运行JavaScript,因此在客户端渲染的页面上返回空的壳;指南通过httpcloak的0个引用块和来自Scrapeless的10个引用块(含渲染)对此进行了证明。
  • 当网络指纹成为障碍时使用httpcloak,而当页面需要渲染、存在挑战或需要IP轮换时使用Scrapeless。
  • 如果仅凭指纹无法访问某些页面,可以从 Scrapeless免费计划 开始。

服务器可以在读取响应的字节之前,在多个层面上对请求进行指纹识别。TLS ClientHello就是其中之一。HTTP/2 SETTINGS帧是另一个。TCP选项是第三个。只修复TLS层的客户端在其他层仍然显得突出,而检测多个层的检测器会标记不匹配。httpcloak通过借用真实浏览器的指纹一次性解决整个栈的问题。

本指南回顾了httpcloak生成的指纹,解释了为何其中一个指纹在不同运行间变化,而其他指纹保持不变,然后划清了httpcloak无法跨越的界限。在需要真实浏览器的页面上, Scrapeless通用抓取API 将接管。下面的每个值都来自一次实际运行。

httpcloak 模拟的内容

httpcloak 是一个类似 requests 的客户端,它在多个层上重现浏览器的指纹。在TLS层上它展示浏览器的JA3和JA4。在传输层上,它重现HTTP/2 SETTINGS帧、窗口大小和流优先级,这些共同形成在 HTTP/2协议 上定义的指纹,并扩展到HTTP/3和TCP选项。您可以通过预设选择目标,而 httpcloak库 列出了它所支持的浏览器版本,从 chrome-146firefox-133safari-18

httpcloak 不会运行浏览器。没有JavaScript引擎,也没有渲染。它是一组指纹,而不是浏览器。

安装

httpcloak 是一个单独的pip安装。

bash Copy
pip install httpcloak

读取全栈指纹

传入一个 preset,httpcloak将构建该浏览器的网络签名。下面的请求要求指纹识别服务报告它所看到的层。

python Copy
import httpcloak

response = httpcloak.get("https://tls.peet.ws/api/all", preset="chrome-146", timeout=30)
data = response.json()
print("http 版本:", data["http_version"])
print("ja3 哈希:", data["tls"]["ja3_hash"])
print("ja4:", data["tls"]["ja4"])
print("http2 akamai 哈希:", data["http2"]["akamai_fingerprint_hash"])

该服务报告HTTP/2、JA3哈希、JA4指纹和HTTP/2指纹,所有信息来自一次请求。

text Copy
http 版本: h2
ja3 哈希: 0f368595c1c27a2c9024014615c2a295
ja4: t13d1516h2_8daaf6152771_d8a2da3f94cd
http2 akamai 哈希: 52d84b11737d980aef856699f885ca86

一次请求,多重指纹

运行该脚本两次,ja3 哈希会变化,而ja4http2 akamai 哈希保持不变。这不是不稳定。GREASE机制 会向TLS ClientHello中插入随机保留值,而JA3会对这些值进行哈希,因此JA3在不同连接间变动,正如真实Chrome所做的那样。JA4指纹 排序并排除GREASE值,因此它是稳定的,而HTTP/2指纹来自固定的SETTINGS帧,因此它也很稳定。教训是,一个请求有多个指纹,而仅检查JA3会看到噪声,而可信号则存在于JA4和HTTP/2层。

httpcloak 停止的地方

全栈网络指纹能够使请求通过指纹检查,但它并不渲染页面。在一个用JavaScript构建内容的网站上,httpcloak会返回服务器发送的内容,即一个空壳体,任何指纹准确性都无法填充它。这是需要渲染工具的地方。

在shell中设置您的Scrapeless密钥。运行时使用真实密钥,并将占位符保留在您的源代码之外。

bash Copy
export SCRAPELESS_API_KEY="sk_your_key_here"

下面的脚本通过两种方式获取一个JavaScript渲染的报价页面:使用httpcloak和完整的浏览器指纹,以及开启渲染的Scrapeless。

python Copy
import json
import os
import urllib.request

import httpcloak

JS_PAGE = "https://quotes.toscrape.com/js/"

response = httpcloak.get(JS_PAGE, preset="chrome-146", timeout=30)
print("httpcloak状态:", response.status_code)
print("httpcloak报价块数量:", response.text.count('class="quote"'))


def scrapeless(url: str) -> str:
    payload = json.dumps(
        {"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": True, "headless": True}}
    ).encode()
    request = urllib.request.Request(
        "https://api.scrapeless.com/api/v2/unlocker/request",
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=90) as response:
        return json.loads(response.read())["data"]


html = scrapeless(JS_PAGE)
print("scrapeless报价块数量:", html.count('class="quote"'))

httpcloak获取了一个干净的200状态,但没有报价,因为这些报价是由JavaScript生成的,它从未运行。Scrapeless渲染页面后,报价显示出来。

text Copy
httpcloak状态: 200
httpcloak报价块数量: 0
scrapeless报价块数量: 10

这个200状态是个陷阱:请求成功,所以看起来没什么问题,但内容并不在。两种工具解决不同的问题。httpcloak在层级之间复制浏览器的网络指纹;它不进行渲染,也不清除挑战或旋转IP。对于服务器测量的更广泛视图,关于浏览器指纹识别的指南涵盖了网络栈之外的信号。

在跨站点运行这些之前,先阅读其robots.txt和条款。机器人排除协议规定了网站要求自动客户端避免的路径,尊重这一点使得爬虫可持续。

准备好访问单凭指纹无法到达的页面了吗?创建一个免费的Scrapeless账户并进行渲染。

结论

当墙是网络指纹时,httpcloak是合适的工具,它对此非常全面:JA3、JA4、HTTP/2、HTTP/3和TCP都是通过一次请求选定的浏览器预设。而它的局限同样明确,因为它不运行任何JavaScript,返回的是客户端渲染页面的空壳。回顾指纹以理解哪些是稳定的,在握手是壁垒的地方使用httpcloak,而当需要渲染、清除挑战或新IP时,将页面交给Scrapeless。根据上面的脚本开始,并将工具匹配到你面前的检查。

从Scrapeless免费计划开始获取渲染页面,并在考虑定期工作时查看Scrapeless定价

常见问题

问:httpcloak模拟了哪些层?

httpcloak在TLS层(JA3和JA4)、HTTP/2层(SETTINGS帧、窗口大小和优先级)、HTTP/3和TCP选项上复制浏览器指纹。一个仅支持TLS的客户端只处理第一个,而httpcloak旨在使每一层的多层检测器检查匹配同一浏览器。

问:为什么JA3哈希在运行之间变化,而JA4则没有?

JA3包括浏览器在TLS ClientHello中随机化的GREASE值,因此每次连接都会变化。JA4对这些GREASE值进行排序和排除,因此对同一客户端保持不变,而HTTP/2指纹来自固定的帧,因此也很稳定。JA3变化而JA4稳定是预期的,而不是失败。

问:httpcloak能爬取JavaScript渲染的页面吗?

不能。httpcloak没有JavaScript引擎,因此在客户端渲染的页面上,它返回初始HTML壳,状态为200,但没有渲染内容。对于这些页面,请使用如Scrapeless之类的渲染工具,而httpcloak则用于内容已在响应中的端点。

问:我该如何选择要模拟的浏览器?

传递带有已提供浏览器名称的preset参数,例如chrome-146firefox-133safari-18。预设会在每一层上同时设置指纹,因此从一个浏览器切换到另一个浏览器只需更改一个参数,而不是逐层配置。

问:仅凭网络指纹是否足够避免封锁?
这只足够进行指纹检查,其他则不需要。JavaScript 挑战、行为分析和 IP 声誉是 httpcloak 不涉及的独立防御,因此当这些在起作用时,您需要在指纹之上进行渲染、挑战处理或代理轮换。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录