使用 curl_cffi 解决 Web 抓取中的 TLS/JA3 指纹识别方法

2024-08-29 08:04

本文主要是介绍使用 curl_cffi 解决 Web 抓取中的 TLS/JA3 指纹识别方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

在网站抓取过程中遇到反爬虫措施而苦苦挣扎?curl_cffi 是一个高级 Python 库,它包装了 cURL 工具,可以帮助您有效地绕过这些障碍。通过模拟浏览器行为并利用 cURL 的功能,curl_cffi 增强了您的抓取器避免检测并顺利执行的能力。在本指南中,我们将探讨 curl_cffi 的工作原理、如何将其用于各种任务以及其局限性。我们还将讨论克服这些局限性的潜在解决方案。

什么是 curl_cffi?

curl_cffi 是一个专为网络请求设计的 Python 库,类似于 requestshttpx 等库。然而,与这些库不同的是,curl_cffi 可以模拟浏览器 TLS/JA3 和 HTTP/2 指纹。curl-impersonate 是一个命令行工具,可以模拟四种主要浏览器并执行 TLS 和 HTTP 握手,就像真实的浏览器一样。curl_cffi 使用 cfficurl-impersonate 包装成 Python 库。

难以解决令人厌烦的验证码,反复失败?

使用 CapSolver 的 AI 驱动的自动网页解封技术,发现无缝的自动验证码解决方案!

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

什么是 TLS/JA3 指纹?

如今,大多数网站使用 HTTPS。为了建立 HTTPS 连接,服务器和客户端之间会进行 TLS 握手,交换信息,例如支持的 TLS 版本和加密算法。不同的客户端具有不同的特征,这些细节通常是稳定的,允许服务器识别请求是来自典型用户浏览器还是自动化脚本。JA3 是一个常用的算法,用于生成 TLS 指纹。它的工作原理是将这些特征连接起来并计算 MD5 哈希值。

使用 curl_cffi

curl_cffi 的使用方法与 requests 非常相似。以下是如何使用 requests 获取 JA3 指纹:

import requestsurl = "https://tls.browserleaks.com/json"
r = requests.get(url)
print(r.json())

你可能会得到类似下面的结果:

{"user_agent": "python-requests/2.32.3","ja3_hash": "8d9f7747675e24454cd9b7ed35c58707","ja3_text": "771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-11-10-16-22-23-49-13-43-45-51-21,29-23-30-25-24,0-1-2","ja3n_hash": "a790a1e311289ac1543f411f6ffceddf","ja3n_text": "771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-10-11-13-16-21-22-23-43-45-49-51,29-23-30-25-24,0-1-2","akamai_hash": "","akamai_text": ""
}

如果您反复发出请求,您会发现您的 JA3 哈希值保持不变。然而,从 Chrome 110 版本开始,TLS ClientHello 扩展的顺序被随机化,这使得网站开发者更容易根据 JA3 指纹来阻止像 requests 这样的库。如果您的请求始终显示相同的 JA3 指纹,它们可能会被识别为来自单个用户,从而增加被标记为机器人的可能性。

以下是如何使用 curl_cffi 来模拟真实的 JA3 指纹:

from curl_cffi import requestsurl = "https://tls.browserleaks.com/json"
r = requests.get(url, impersonate="chrome124")
print(r.json())

impersonate 参数允许您指定要模拟的浏览器和版本。支持的浏览器包括 Chrome、Chrome Android、Edge 和 Safari,版本不断更新。有关详细信息,请参阅 curl_cffi GitHub 仓库。使用 curl_cffi,JA3 指纹将与真实浏览器的指纹一致,并且从 Chrome 110 版本开始,JA3 指纹将在每次请求时发生变化:

{"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36","ja3_hash": "c97c8dac4ca1de968fe230de54f3e0f3","ja3_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,16-10-27-18-5-51-23-17513-45-35-43-13-65281-0-11-65037,25497-29-23-24,0","ja3n_hash": "4c9ce26028c11d7544da00d3f7e4f45c","ja3n_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-5-10-11-13-16-18-23-27-35-43-45-51-17513-65037-65281,25497-29-23-24,0","akamai_hash": "52d84b11737d980aef856699f885ca86","akamai_text": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p"
}

解决 curl_cffi 的限制

虽然 curl_cffi 可以模拟真实的 JA3 指纹,并可能避免机器人挑战和封锁,但它可能并不总是足够。许多网站实施了先进的机器人保护机制,例如 hCaptcha、reCaptcha、Geetest、Cloudflare Turnstile、DataDome 和 AWS WAF。这些系统使用复杂的图像和难以阅读的 JavaScript 挑战来区分人和机器人。有时,即使拥有真实且随机化的 JA3 指纹,也无法避免绕过这些挑战。

如果您遇到 CAPTCHA 挑战,无论您使用哪个请求库,它们都可能是不可避免的。但是,无需担心。CapSolver 为这些问题提供了解决方案。CapSolver 使用基于 AI 的自动化网页解锁技术,可在几秒钟内解决各种机器人挑战。无论处理图像还是复杂问题,CapSolver 都能高效地处理。如果解决方案失败,您将不会产生任何费用。

CapSolver 还提供浏览器扩展,可使用 Selenium 在数据抓取过程中自动解决 CAPTCHA。此外,还提供 API 解决方案,用于在 Scrapy 等框架中解决 CAPTCHA 并获取令牌。所有这些都可以在几秒钟内完成。有关更多详细信息,请参阅 CapSolver 文档。

结论

通过将 curl_cffi 集成到您的网页抓取设置中,您可以有效地模拟真实浏览器行为,以克服 TLS/JA3 指纹挑战。虽然 curl_cffi 为处理这些挑战提供了强大的工具,但高级 CAPTCHA 和机器人检测系统仍然构成重大障碍。CapSolver 提供了一种补充解决方案,可以无缝解决这些 CAPTCHA 挑战,确保您的抓取活动顺利运行。

如需了解更多见解和资源,请访问 CapSolver 网站 并探索 curl_cffi GitHub 仓库。

CapsolverCN官 方代理交流扣 群:497493756

这篇关于使用 curl_cffi 解决 Web 抓取中的 TLS/JA3 指纹识别方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117304

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l