
你是不是也遇到过这种事——用 requests 或者 curl 写个爬虫,刚跑两下,直接给你弹个 403;换个网站更狠,Cloudflare 五秒盾 + 验证码 直接把你挡在门外。
你代码没毛病,IP 也没封,为啥就认定你是机器人?答案可能让你意外:不是你抓错了,是「握手」的时候你就露馅了。
把 curl 伪装成真浏览器
反爬指纹系统,根本分不清你是人还是机器
一句话:curl-impersonate = 一个「换皮」过的 curl,TLS 和 HTTP/2 握手跟真实 Chrome / Firefox 完全一致,让网站以为你就是个正在用浏览器的真人。
01
PART
网站到底怎么认出你是机器人?
HOW SITES DETECT BOTS
关键在「握手」,不在「内容」。
TLS 握手(Client Hello)
你和网站建立加密连接时,发的第一个包里带着一堆 TLS 参数(加密套件、扩展、曲线……)。浏览器和 curl 发出来的这堆参数长得完全不一样,网站一眼就能认出「这不是真浏览器」。
HTTP/2 握手
如果网站用 HTTP/2,连接时还会交换一堆设置项。普通 HTTP 客户端用的设置,跟真实浏览器也对不上。
TLS 指纹 / HTTP/2 指纹
这些特征合起来叫 TLS 指纹 / HTTP/2 指纹。现在很多站点就靠它来识别机器人——你内容爬得再像,握手不对,照样被拦。
你内容爬得再像,握手不对,照样被拦
指纹识别,正在成为反爬的第一道防线
02
PART
curl-impersonate 怎么破的?
HOW IT WORKS
作者把 curl 大改了一遍:
1
换底层 TLS 库:Firefox 版用 NSS(火狐同款),Chrome 版用 BoringSSL(谷歌同款),从根上贴近浏览器的握手行为。
2
对齐每一个参数:加密套件、曲线、扩展、HTTP/2 设置,甚至一些非默认命令行参数(--ciphers、--curves、特定请求头),全部按真实浏览器调。
3
结果:网络层面和真浏览器一模一样,从流量上看它就是个 Chrome / Firefox,反爬指纹系统直接被绕过去。
从流量上看,它就是个 Chrome / Firefox
03
PART
三步上手,会 curl 就会用
GET STARTED IN 3 STEPS
STEP 01
macOS 用 Homebrew 一行装好;Docker 官方镜像一行拉起,开箱即用;也能按 README 编译源码,支持 Chrome / Firefox / Edge / Safari 多版本。
bash
brew install curl-impersonate
STEP 02
比如伪装成 Chrome 99:下面这行一跑,握手的指纹就变成 Chrome 99 了。你原来怎么写 curl,现在就怎么写。
bash
curl_chrome99 https://www.example.com
STEP 03
它不只是命令行,还能当 libcurl 的替代品直接嵌进你的程序。具体写法看下一章。
04
PART
在代码里当库用(更爽)
USE IT AS A LIBRARY
它不只是命令行,还能当 libcurl 的替代品直接嵌进你的程序:
Python:用 curl_cffi(基于 curl-impersonate 的封装)
python
from curl_cffi import requests
r = requests.get("https://www.example.com", impersonate="chrome")
一行 impersonate 参数直接指定要伪装成哪个浏览器,干净利落。
其他语言同样能 impersonate
Node 里同样能 impersonate;还有 Go、Rust 等多语言封装,主流爬虫框架也能直接接。
05
PART
能伪装哪些浏览器?
SUPPORTED BROWSERS
Chrome、Edge、Safari、Firefox 全家桶都行,还细分不同大版本(比如 chrome99 / chrome100 / chrome120),跟着真实浏览器的版本走,保持指纹不过时。
Chrome 全系(chrome99 / 100 / 120…)
Edge
Safari
Firefox 全家桶
06
PART
爬虫党的隐藏搭配
PRO TIPS
前面的 Scrapling 自带 StealthyFetcher、Firecrawl 内置代理——把它们和 curl-impersonate 的思路结合,过 Cloudflare 这类硬骨头会顺很多。