使用 cURL Impersonate 进行网页抓取指南

学习如何使用 cURL Impersonate 模拟浏览器行为进行网页抓取,提供关于命令行和 Python 使用的详细指导,以及高级技巧。
3 min read
使用cURL伪装进行网页爬取

在本指南中,您将学习:

  • 什么是 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_chrome116curl_edge101curl_ff117curl_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 抓取基础设施,或与我们的一位数据专家讨论我们的抓取解决方案。