在本指南中,您将学习:
- 什么是 cURL Impersonate
- 该项目的背景原因以及工作原理
- 如何通过命令行使用它
- 如何在 Python 中使用它
- 高级技术和方面
让我们开始吧!
什么是 cURL Impersonate?
cURL Impersonate 是 cURL 的特殊构建版本,旨在模仿主流浏览器(即 Chrome、Edge、Safari 和 Firefox)的行为。具体来说,这个工具执行的 TLS 和 HTTP 握手与真实浏览器非常相似。
这个 HTTP 客户端可以通过类似于常规 curl
的命令行工具 curl-impersonate
来使用,或者在 Python 中作为一个库来使用。
以下是可以被模拟的浏览器:
浏览器 | 模拟的操作系统 | 包装脚本 |
Chrome 99 | Windows 10 | curl_chrome99 |
Chrome 100 | Windows 10 | curl_chrome100 |
Chrome 101 | Windows 10 | curl_chrome101 |
Chrome 104 | Windows 10 | curl_chrome104 |
Chrome 107 | Windows 10 | curl_chrome107 |
Chrome 110 | Windows 10 | curl_chrome110 |
Chrome 116 | Windows 10 | curl_chrome116 |
Chrome 99 | Android 12 | curl_chrome99_android |
Edge 99 | Windows 10 | curl_edge99 |
Edge 101 | Windows 10 | curl_edge101 |
Firefox 91 ESR | Windows 10 | curl_ff91esr |
Firefox 95 | Windows 10 | curl_ff95 |
Firefox 98 | Windows 10 | curl_ff98 |
Firefox 100 | Windows 10 | curl_ff100 |
Firefox 102 | Windows 10 | curl_ff102 |
Firefox 109 | Windows 10 | curl_ff109 |
Firefox 117 | Windows 10 | curl_ff117 |
Safari 15.3 | macOS Big Sur | curl_safari15_3 |
Safari 15.5 | macOS Monterey | curl_safari15_5 |
每个支持的浏览器都有一个特定的包装脚本。它配置 curl-impersonate
以适当的头信息、标志和设置来模拟特定的浏览器。
curl-impersonate
的工作原理
当您通过 HTTPS 向网站发送请求时,会发生一个称为 TLS 握手 的过程。在此握手期间,有关 HTTP 客户端的详细信息会与 Web 服务器共享,创建一个独特的 TLS 指纹。
HTTP 客户端的功能和配置与标准浏览器有所不同。这种差异会导致一个 TLS 指纹,它可以轻松揭示 HTTP 客户端的使用。因此,目标站点使用的反机器人措施可以将您的请求检测为自动化并可能阻止它们。
cURL Impersonate 通过修改标准的 curl
工具来解决这个问题,使其 TLS 指纹与真实浏览器的匹配。它通过以下方式实现目标:
- TLS 库修改:对于
curl-impersonate
的 Chrome 版本,curl
使用 Google 的 TLS 库 BoringSSL 编译。对于 Firefox 版本,curl
使用 Firefox 使用的 TLS 库 NSS 编译。 - 配置调整:它修改了 cURL 配置各种 TLS 扩展和 SSL 选项的方式,以模仿真实浏览器的设置。它还添加了对浏览器常用的新 TLS 扩展的支持。
- HTTP/2 握手定制:它更改了 cURL 用于 HTTP/2 连接的设置,使其与真实浏览器的一致。
- 非默认标志:它运行了一些特定的非默认标志,如
--ciphers
、--curves
和一些 -H 头,这进一步有助于模仿浏览器行为。
因此,curl-impersonate
使 curl
请求从网络角度看起来就像是由真实浏览器发出的。这对于绕过许多机器人检测机制非常有用!
curl-impersonate:命令行教程
按照以下步骤学习如何从命令行使用 cURL Impersonate。
注意:为了完整性,将展示多种安装方法。然而,您只需要选择一种。推荐的方法是使用 Docker。
从预编译的二进制文件安装
您可以从项目的 GitHub 发布页面 下载适用于 Linux 和 macOS 的预编译二进制文件。这些二进制文件包含静态编译的 curl-impersonate
。在使用它们之前,请确保您已安装以下内容:
- NSS(网络安全服务):一组用于支持跨平台开发安全客户端和服务器应用程序的库。NSS 在 Mozilla 的产品如 Firefox 和 Thunderbird 中用于处理 TLS 协议。
- CA 证书:在安全通信期间用于验证服务器和客户端身份的数字证书集合。它们通过验证服务器的证书已由认可的 CA(证书颁发机构)签署,确保您与服务器的连接是可信的。
要满足先决条件,在 Ubuntu 上,运行:
sudo apt install libnss3 nss-plugin-pem ca-certificates
在 Red Hat、Fedora 或 CentOS 上,执行:
yum install nss nss-pem ca-certificates
在 Archlinux 上,运行:
pacman -S nss ca-certificates
在 macOS 上,执行以下命令:
brew install nss ca-certificates
此外,确保您的系统上已安装 zlib
,因为预编译的二进制包是经过 gzip 压缩的。
通过 Docker 安装
在 Docker Hub 上有基于 Alpine Linux 和 Debian 的 Docker 映像,包含编译好的 curl-impersonate 并可直接使用。这些映像包括二进制文件和所有必要的包装脚本。
Chrome 映像(*-chrome
)可以模拟 Chrome、Edge 和 Safari。而 Firefox 映像(*-ff
)可以模拟 Firefox。
要下载您喜欢的 Docker 映像,使用以下命令之一。
针对 Alpine Linux 上的 Chrome 版本:
docker pull lwthiker/curl-impersonate:0.5-chrome
针对 Alpine Linux 上的 Firefox 版本:
docker pull lwthiker/curl-impersonate:0.5-ff
针对 Debian 上的 Chrome 版本:
docker pull lwthiker/curl-impersonate:0.5-chrome-slim-buster
针对 Debian 上的 Firefox 版本:
docker pull lwthiker/curl-impersonate:0.5-ff-slim-buster
下载完成后,正如您将看到的,您可以使用 docker run 命令执行 curl-impersonate
。
从发行版包安装
在 Arch Linux 上,curl-impersonate
可通过 AUR 包 curl-impersonate-bin
获得。
在 macOS 上,您可以使用以下命令安装非官方的 Homebrew 包(适用于 Chrome 版本):
brew tap shakacode/brew
brew install curl-impersonate
基本用法
无论采用哪种安装方法,您现在都可以使用以下语法执行 curl-impersonate
命令:
curl-impersonate-wrapper [options] [target-url]
或者,等效地,在 Docker 上,运行类似:
docker run --rm lwthiker/curl-impersonate:[curl-impersonate-version]curl-impersonate-wrapper [options] [target_url]
其中:
curl-impersonate-wrapper
是您要使用的 cURL Impersonate 包装器(例如,curl_chrome116
、curl_edge101
、curl_ff117
、curl_safari15_5
等)。选项
是将传递给 cURL 的可选标志。目标URL
是要发送 HTTP 请求的网页的 URL。
在指定自定义选项时要小心,因为某些标志会改变 cURL 的 TLS 签名,可能会使其被检测到。要了解更多,请查看我们的 cURL 入门指南。
请注意,包装器会自动设置默认的 HTTP 头信息集合。要自定义这些头信息,请修改包装脚本以满足您的需求。
现在,让我们使用 curl-impersonate
通过 Chrome 包装器向 Wikipedia 首页发送请求:
curl_chrome110 https://www.wikipedia.org
或者,如果您是 Docker 用户:
docker run --rm lwthiker/curl-impersonate:0.5-chrome curl_chrome110 https://www.wikipedia.org
结果将是:
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<title>Wikipedia</title>
<meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">
<!-- omitted for brevity... -->
太棒了!服务器返回了所需页面的 HTML,就像您通过浏览器访问一样。
您现在可以像 使用 cURL 进行网页抓取 一样使用 cURL Impersonate 进行网页抓取。
curl-impersonate
:Python 教程
命令行使用对于测试来说很好,但网页抓取过程通常依赖于用 Python 等语言编写的自定义脚本。了解用于网页抓取的最佳 编程语言!
幸运的是,您可以在 Python 中使用 cURL Impersonate,感谢 curl-cffi
。这是一个通过 cffi
实现的 curl-impersonate
的 Python 绑定。特别是,curl-cffi
可以模拟浏览器的 TLS/JA3 和 HTTP/2 指纹,以连接到网页而不被阻止。
请在下面的分步部分中了解如何使用它!
先决条件
在开始之前,确保您已:
- 在您的机器上安装了 Python 3.8+
- 设置了带有虚拟环境的 Python 项目
可选地,推荐使用带有 Python 扩展的 Python IDE,如 Visual Studio Code。
安装
通过 pip 安装 curl_cfii
:
pip install curl_cfii
用法
curl_cffi
提供了低级的 curl
API 和高级的类似 requests 的 API。更多信息请参阅 官方文档。
通常,您想要使用类似 requests 的 API。为此,导入 requests
:
from curl_cffi import requests
您现在可以在 Python 中使用 cURL Impersonate 的 Chrome 版本连接到网页:
response = requests.get("https://www.wikipedia.org", impersonate="chrome")
使用以下命令打印响应的 HTML:
print(response.text)
把它们组合起来,您将得到:
from curl_cffi import requests
# make a GET request to the target page with
# the Chrome version of curl-impersonate
response = requests.get("https://www.wikipedia.org", impersonate="chrome")
# print the server response
print(response.text)
运行上述 Python 脚本,它将打印:
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<title>Wikipedia</title>
<meta name="description" content="Wikipedia is a free online encyclopedia, created and edited by volunteers around the world and hosted by the Wikimedia Foundation.">
<!-- omitted for brevity... -->
太好了!您现在可以像使用 Requests 和 Beautiful Soup 一样在 Python 中执行网页抓取。有关更多指导,请参阅我们的 使用 Python 进行网页抓取 指南。
cURL Impersonate 高级用法
现在是探索一些高级用法和技术的时候了!
代理集成
模拟浏览器指纹可能还不够。反机器人解决方案可能仍会阻止您,特别是如果您在短时间内发出太多自动请求。这时,代理就派上用场了!
通过将您的请求路由通过 代理服务器,您可以获得一个新的 IP 地址并保护您的身份。
假设您的代理服务器的 URL 是:
http://84.18.12.16:8888
cURL Impersonate 支持通过命令行使用 -x 标志进行代理集成:
curl-impersonate -x http://84.18.12.16:8888 https://httpbin.org/ip
有关更多详细信息,请阅读 如何在 cURL 中设置代理。
在 Python 中,您可以像在 requests
中一样设置代理:
from curl_cffi import requests
proxies = {"http": "http://84.18.12.16:8888", "https": "http://84.18.12.16:8888"}
response = requests.get("https://httpbin.org/ip", impersonate="chrome", proxies=proxies)
有关更多信息,请参阅如何 在 Python requests 中集成代理。
Libcurl 集成
libcurl-impersonate 是编译版的 libcurl
,包含相同的 cURL Impersonate 功能。它还提供了扩展的 API,用于调整 TLS 详细信息和头配置。
libcurl-impersonate
可以使用 预编译包 安装。它的目标是促进 cURL Impersonate 在各种编程语言中的库集成,例如 curl-cffi
Python 包。
结论
在本文中,您了解了什么是 cURL Impersonate、它的工作原理,以及如何通过 CLI 和在 Python 中使用它。您现在明白,它是一个用于在模拟真实浏览器的 TLS 指纹的同时发出 HTTP 请求的工具。
问题是,像 Cloudflare 这样先进的反机器人解决方案可能仍会将您的请求检测为来自机器人的请求。解决方案是什么?Bright Data 的 Scraper API——下一代、全方位、综合性的抓取解决方案。
Scraper API 提供了使用 cURL 或任何其他 HTTP 客户端执行自动化 Web 请求所需的一切。这个全功能的解决方案为您处理浏览器指纹、验证码解决和 IP 轮换,以绕过任何反机器人技术。进行自动化 HTTP 请求从未如此简单!
立即注册免费试用 Bright Data 的 Web 抓取基础设施,或与我们的一位数据专家讨论我们的抓取解决方案。