CAPSOLVER
博客
如何使用curl_cffi进行网页抓取

如何使用curl_cffi进行网页抓取

Logo of CapSolver

Anh Tuan

Data Science Expert

17-Sep-2024

什么是curl_cffi?

curl_cffi 是一个 Python 库,它使用 CFFI(C 外部函数接口)为 libcurl 库提供高效的底层绑定。这允许您以高性能和细粒度控制来执行 HTTP 请求,类似于 curl 命令行工具,但在 Python 中。它对于需要速度和高级配置的网页抓取任务特别有用。

特性:

  • 高性能: 利用 libcurl 的速度来快速进行 HTTP 请求。
  • 线程安全: 可安全用于多线程应用程序。
  • 高级特性: 支持代理、SSL/TLS 配置、自定义标头等。
  • 底层控制: 提供对请求和响应过程的详细控制。

先决条件

在深入使用 curl_cffi 之前,请确保已安装以下内容:

在 Ubuntu/Debian 系统上,您可能需要安装 libcurl 开发头文件:

bash 复制代码
sudo apt-get install libcurl4-openssl-dev

开始使用curl_cffi

安装

使用 pip 安装 curl_cffi

bash 复制代码
pip install curl_cffi

基本示例:发出 GET 请求

这是一个使用 curl_cffi 执行 GET 请求的基本示例:

python 复制代码
from curl_cffi import requests

# 执行 GET 请求
response = requests.get('https://httpbin.org/get')

# 检查状态码
print(f'状态码: {response.status_code}')

# 打印响应内容
print('响应正文:', response.text)

网页抓取示例:从网站抓取引言

让我们抓取一个网页来提取信息。我们将使用 引言抓取 来获取所有引言及其作者。

python 复制代码
from curl_cffi import requests
from bs4 import BeautifulSoup

# 要抓取的 URL
url = 'http://quotes.toscrape.com/'

# 执行 GET 请求
response = requests.get(url)

# 使用 BeautifulSoup 解析 HTML 内容
soup = BeautifulSoup(response.content, 'html.parser')

# 查找所有引言元素
quotes = soup.find_all('div', class_='quote')

# 提取并显示引言和作者
for quote in quotes:
    text = quote.find('span', class_='text').get_text()
    author = quote.find('small', class_='author').get_text()
    print(f'{text} — {author}')

输出:

复制代码
“我们创造的世界是我们思维的产物。如果不改变我们的思维方式,我们就无法改变这个世界。” — 阿尔伯特·爱因斯坦
“哈利,是我们自己的选择,而不是我们的能力,显示了我们真正的本质。” — J.K. 罗琳
... (其他引言)

使用 CapSolver 和 curl_cffi 处理验证码

在本节中,我们将探讨如何将 CapSolvercurl_cffi 集成以绕过验证码。CapSolver 是一项外部服务,可帮助解决各种类型的验证码,包括网站上常用的 ReCaptcha V2。

我们将演示如何使用 CapSolver 解决 ReCaptcha V2,然后抓取需要先解决验证码的页面的内容。

示例:使用 CapSolver 和 curl_cffi 解决 ReCaptcha V2

python 复制代码
import os
import capsolver
from curl_cffi import requests

# 考虑使用环境变量存储敏感信息
capsolver.api_key = os.getenv("CAPSOLVER_API_KEY", "Your CapSolver API Key")
PAGE_URL = os.getenv("PAGE_URL", "https://example.com")  # 包含验证码页面的 URL
PAGE_KEY = os.getenv("PAGE_SITE_KEY", "SITE_KEY")        # 验证码的站点密钥

def solve_recaptcha_v2(url, site_key):
    solution = capsolver.solve({
        "type": "ReCaptchaV2TaskProxyless",
        "websiteURL": url,
        "websiteKey": site_key,
        "proxy": PROXY
    })
    return solution['solution']['gRecaptchaResponse']

def main():
    print("正在解决 reCaptcha V2...")
    captcha_solution = solve_recaptcha_v2(PAGE_URL, PAGE_KEY)
    print("验证码已解决!")

if __name__ == "__main__":
    main()

注意:PAGE_URL 替换为包含验证码的页面的 URL,并将 PAGE_SITE_KEY 替换为验证码的站点密钥。您可以在页面的 HTML 源代码中找到站点密钥,通常位于包含验证码小部件的 <div> 内。

使用 curl_cffi 处理代理

如果您需要通过代理路由请求,curl_cffi 使其变得非常简单:

python 复制代码
from curl_cffi import requests

# 定义代理设置
proxies = {
    'http': 'http://username:password@proxyserver:port',
    'https': 'https://username:password@proxyserver:port',
}

# 使用代理执行 GET 请求
response = requests.get('https://httpbin.org/ip', proxies=proxies)

# 打印响应内容
print('响应正文:', response.text)

您可以使用 Python 的 http.cookiejar 模块中的 CookieJar 来管理 Cookie:

python 复制代码
from curl_cffi import requests
from http.cookiejar import CookieJar

# 创建 CookieJar 实例
cookie_jar = CookieJar()

# 使用 Cookie jar 创建会话
session = requests.Session()
session.cookies = cookie_jar

# 执行 GET 请求
response = session.get('https://httpbin.org/cookies/set?name=value')

# 显示 Cookie
for cookie in session.cookies:
    print(f'{cookie.name}: {cookie.value}')

高级用法:自定义标头和 POST 请求

您可以使用 curl_cffi 发送自定义标头和执行 POST 请求:

python 复制代码
from curl_cffi import requests

# 定义自定义标头
headers = {
    'User-Agent': 'Mozilla/5.0 (compatible)',
    'Accept-Language': 'en-US,en;q=0.5',
}

# 要在 POST 请求中发送的数据
data = {
    'username': 'testuser',
    'password': 'testpass',
}

# 执行 POST 请求
response = requests.post('https://httpbin.org/post', headers=headers, data=data)

# 打印 JSON 响应
print('响应 JSON:', response.json())

奖励代码

CapSolver 上领取顶级验证码解决方案的奖励代码scrape。兑换后,每次充值后您将获得额外的 5% 奖励,无限次。

结论

使用 curl_cffi,您可以高效地执行网页抓取任务,同时对 HTTP 请求进行详细控制。将其与 CapSolver 集成,您可以绕过像 ReCaptcha V2 这样的验证码,从而访问原本难以抓取的内容。

随意扩展这些示例以满足您的特定抓取需求。始终记住尊重您抓取的网站的服务条款并遵守法律规定。

祝您抓取愉快!

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多