httpcloak网页抓取:Python中的全栈浏览器指纹
Expert Network Defense Engineer
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-146 到 firefox-133 和 safari-18。
httpcloak 不会运行浏览器。没有JavaScript引擎,也没有渲染。它是一组指纹,而不是浏览器。
安装
httpcloak 是一个单独的pip安装。
bash
pip install httpcloak
读取全栈指纹
传入一个 preset,httpcloak将构建该浏览器的网络签名。下面的请求要求指纹识别服务报告它所看到的层。
python
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
http 版本: h2
ja3 哈希: 0f368595c1c27a2c9024014615c2a295
ja4: t13d1516h2_8daaf6152771_d8a2da3f94cd
http2 akamai 哈希: 52d84b11737d980aef856699f885ca86
一次请求,多重指纹
运行该脚本两次,ja3 哈希会变化,而ja4和http2 akamai 哈希保持不变。这不是不稳定。GREASE机制 会向TLS ClientHello中插入随机保留值,而JA3会对这些值进行哈希,因此JA3在不同连接间变动,正如真实Chrome所做的那样。JA4指纹 排序并排除GREASE值,因此它是稳定的,而HTTP/2指纹来自固定的SETTINGS帧,因此它也很稳定。教训是,一个请求有多个指纹,而仅检查JA3会看到噪声,而可信号则存在于JA4和HTTP/2层。
httpcloak 停止的地方
全栈网络指纹能够使请求通过指纹检查,但它并不渲染页面。在一个用JavaScript构建内容的网站上,httpcloak会返回服务器发送的内容,即一个空壳体,任何指纹准确性都无法填充它。这是需要渲染工具的地方。
在shell中设置您的Scrapeless密钥。运行时使用真实密钥,并将占位符保留在您的源代码之外。
bash
export SCRAPELESS_API_KEY="sk_your_key_here"
下面的脚本通过两种方式获取一个JavaScript渲染的报价页面:使用httpcloak和完整的浏览器指纹,以及开启渲染的Scrapeless。
python
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
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-146、firefox-133或safari-18。预设会在每一层上同时设置指纹,因此从一个浏览器切换到另一个浏览器只需更改一个参数,而不是逐层配置。
问:仅凭网络指纹是否足够避免封锁?
这只足够进行指纹检查,其他则不需要。JavaScript 挑战、行为分析和 IP 声誉是 httpcloak 不涉及的独立防御,因此当这些在起作用时,您需要在指纹之上进行渲染、挑战处理或代理轮换。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



