python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾

news2024/9/24 18:05:10

现在越来越多的网站已经能够通过JA3或者其他指纹信息,来识别你是不是爬虫了。传统的方式比如换UA,加代理是没有任何意义了,所以这个时候我们就需要使用到curl_cffi 了。

1.TLS 指纹是啥?

在绝大多数的网站都已经使用了 HTTPS,要建立 HTTPS 链接,服务器和客户端之间首先要进行
TLS 握手,在握手过程中交换双方支持的 TLS 版本,加密算法等信息。不同的客户端之间的差异
很大,而且一般这些信息还都是稳定的,所以服务端就可以根据 TLS 的握手信息来作为特征,识别
一个请求是普通的用户浏览器访问,还是来自 Python 脚本等的自动化访问。

JA3 是生成 TLS 指纹的一个常用算法。它的工作原理也很简单,大概就是把以上特征拼接并求 md5。

查看 tls 指纹的网站有:

  • https://tls.browserleaks.com/json
  • TrackMe | Home
  • https://kawayiyi.com/tls

不同网站的生成的指纹可能有差异,但是多次访问同一个网站生成的指纹是稳定的,而且能区分开
不同客户端。下文以第一个网站为例。

2.直接安装

pip install curl_cffi

功能简介:

  • 支持JA3/TLS和http2指纹模拟;
  • 比requests/tls_client快分开,和aiohttp/pycurl的速度比肩;
  • 预编译,不需要自己的机器上再弄一遍;
  • 支持asyncio,并且每个请求都可以换代理;
  • 修改请求的API,支持http 2.0;
  • 模仿requests。

先来看一段代码:

import requests
from pprint import pprint
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Chromium";v="118", "Microsoft Edge";v="118", "Not=A?Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46',
}

response = requests.get('https://tls.browserleaks.com/json', headers=headers)
pprint(response.json())

运行效果:

在这里插入图片描述

这是直接使用Requests发起的请求。你可以试一试,加上代理以后,这里的ja3_hash并不会发生变化。并且akamai_hashakamai_text都是空。这个特征是非常明显的,网站直接根据这些特征就可以屏蔽你的爬虫。

于是为了完美模拟浏览器,国外大佬开发出了 curl-impersonate,将 curl 底层依赖的库全部换成了浏览器使用的库,并且版本也是一致的,这样生成的指纹就和浏览器完全一样了。

而 curl_cffi 正是 curl-impersonate 的 Python binding,我们直接使用 pip 安装即可。

那这个问题咋解决尼?

只需要 把 import requests 改成 from curl_cffi import requests。最后,在requests.get中加一个参数:impersonate="chrome110"

代码如下:

# import requests
from curl_cffi import requests
from pprint import pprint
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Chromium";v="118", "Microsoft Edge";v="118", "Not=A?Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.46',
}

response = requests.get('https://tls.browserleaks.com/json', headers=headers, impersonate="chrome110")
pprint(response.json())

这次再运行下代码:

在这里插入图片描述

这次可以看到akamai_hashakamai_text 已经都有了,网站已经无法识别你的爬虫了。在网站看来,这只是一个Chrome 110版本发起的请求。甚至Akamai需要的签名也都有了。

支持使用 Sessions

session = requests.Session()

也支持使用代理

proxies = {"https": "xxxxx:7890"}
proxies=proxies

支持模拟的浏览器版本:

  • chrome99、
  • chrome100、
  • chrome101、
  • chrome104、
  • chrome107、
  • chrome110、
  • chrome99_android、
  • edge99、
  • edge101、
  • safari15_3、
  • safari15_5

同样它也支持asyncio,示例代码如下所示:

from curl_cffi.requests import AsyncSession

async with AsyncSession() as s:
    r = await s.get("https://example.com")

要使用异步写法时,代码如下:

import asyncio
from curl_cffi.requests import AsyncSession

urls = [
    "https://googel.com/",
    "https://facebook.com/",
    "https://twitter.com/",
]


async def main():
 async with AsyncSession() as s:
     tasks = []
     for url in urls:
         task = s.get("https://example.com")
         tasks.append(task)
     results = await asyncio.gather(*tasks)


asyncio.run(main())

我们以这个网站为例: https://apk.support/ 分析下:

在这里插入图片描述

浏览器抓包是能看到页面返回的关键数据,但是再把这个请求放到postman 发个请求试一下:

在这里插入图片描述
Just a moment...,完蛋凉了 标志性的5s盾。

咋办 用curl_cffi 发个请求试一试?

代码如下:

# import requests
from curl_cffi import requests
url = "https://apk.support/search?q=app"

payload={}
headers = {
  'authority': 'apk.support',
  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
  'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
  'cache-control': 'no-cache',
  'pragma': 'no-cache',
  'referer': 'https://apk.support/search?q=app',
  'sec-ch-ua-mobile': '?0',
  'sec-ch-ua-platform': '"macOS"',
  'sec-fetch-dest': 'document',
  'sec-fetch-mode': 'navigate',
  'sec-fetch-site': 'same-origin',
  'sec-fetch-user': '?1',
  'upgrade-insecure-requests': '1',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
proxies = {
    'http': 'http://127.0.0.1:7890',
    'https': 'http://127.0.0.1:7890'
}
response = requests.get(url=url, headers=headers, impersonate="chrome110", proxies=proxies)

print(response.text)

看看效果:

在这里插入图片描述

可以看到返回的已经是正常数据,不再是5s盾了。

参考链接:

https://mp.weixin.qq.com/s/Ch7taYpD-dnNL2FLOuxgGA
https://blog.csdn.net/qiulin_wu/article/details/134180011
https://blog.csdn.net/resphina/article/details/132507212
https://www.jb51.net/python/302044jai.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【YOLO v5 v7 v8 小目标改进】ODConv:在卷积核所有维度(数量、空间、输入、输出)上应用注意力机制来优化传统动态卷积

ODConv:在卷积核所有维度(数量、空间、输入、输出)上应用注意力机制来优化传统的动态卷积 提出背景传统动态卷积全维动态卷积效果 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 论文:https://openreview.net/pdf?idDmpCfq6Mg…

电商小程序10分类管理

目录 1 分类数据源2 搭建功能3 创建变量读取数据4 绑定数据总结 本篇我们介绍一下电商小程序的分类管理功能的开发,先看我们的原型图: 在首页我们是展示了四个分类的内容,采用上边是图标,下边是文字的形式。使用低代码开发&#…

Redis大数据统计

文章目录 一. 相关面试题1. 面试题一2. 面试题二 二. 统计的类型1. 聚合统计2. 排序统计3. 二值统计4. 基数统计 三. Hyperloglog1. 专业名词2. Hyperloglog使用3. Hyperloglog原理4. Hyperloglog案例 四. GEO1. 面试题2. GEO使用3. GEO案例 五. BitMap1. 面试题2. BitMap使用 …

Java+SpringBoot+Vue:招生宣传的全栈解决方案

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

《汇编语言》- 读书笔记 - 第13章-int 指令

《汇编语言》- 读书笔记 - 第13章-int 指令 13.1 int 指令13.2 编写供应用程序调用的中断例程中断例程:求一 word 型数据的平方主程序中断处理程序执行效果 中断例程:将一个全是字母,以0结尾的字符串,转化为大写主程序中断处理程序…

中央处理器CPU中的技术

1 知识加油站 1.1 cpu 指令的执行过程 取指:cpu 获取 程序计数器 中存放的指令地址。读取内存中此地址对应指令并存入指令寄存器译码:指令译码器,解析指令运行:算数逻辑单元计算回写:将执行结果写入对应位置 2. cpu…

如何使用ShellSweep检测特定目录中潜在的webshell文件

关于ShellSweep ShellSweep是一款功能强大的webshell检测工具,该工具使用了PowerShell、Python和Lua语言进行开发,可以帮助广大研究人员在特定目录中检测潜在的webshell文件。 ShellSweep由多个脚本模块组成,能够通过计算文件内容的熵来评估…

xsslabs第四关

测试 "onclick"alert(1) 这与第三关的代码是一样的&#xff0c;但是每一关考的点是不一样的所以我们看一下源代码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;ch…

C++string类讲解

大家好鸭 见字如面&#xff0c;已经有好久没有写文章了&#xff0c;这段时间忙着学习&#xff0c;也忙着玩&#xff0c;所以停更了一段时间 今天让我们来谈一谈关于C中的string类 什么是string类&#xff1f; 在c语言中我们操作字符串往往采用指针&#xff0c;这样的访问方式并…

不看后悔的腾讯云优惠券领取入口指南,2024最新代金券

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

二级医院云HIS系统,云HIS源码,支持分院HIS,集团HIS

云HIS具有可扩展、易共享、易协同、低成本、体验号、更便捷、易维护的优势&#xff0c;重新定义了数字化医院信息系统&#xff0c;实现数字化医院信息系统的转型升级。云 HIS 系统功能完善&#xff0c;涵盖临床各业务部门&#xff0c;采集、抽提、汇总、存贮、展现所有的临床诊…

FL Studio 21.2.3.3586 for Mac中文版新功能介绍及2024年最新更新日志

如果你正计划学习音乐制作&#xff0c;一款强大且易学的音乐制作软件是必不可少的。由于很多小伙伴对音乐制作软件没有实际体验过&#xff0c;到底选择哪一款软件最合适成为当下最纠结的问题。 这里为大家推荐一款功能强大且适合新手小伙伴的音乐编曲软件—FL Studio 21.2.3.35…

[物联网] OneNet 多协议TCP透传

[物联网] OneNet 多协议TCP透传 STM32物联网–ONENET云平台的多协议接入产品创建 : https://blog.csdn.net/qq_44942724/article/details/134492924 Onenet tcp 透传 : https://blog.csdn.net/flyme2010/article/details/107086001 tcp服务端测试工具 : http://tcp.xnkiot.com/…

解决导入项目后在idea中不显示的问题

问题&#xff1a; 今天下午重新打开寒假之前负责的项目&#xff0c;发现打不开了&#xff0c; 从master拉取最新代码到我的分支&#xff0c;发现我的分支上显示就是这样子&#xff0c;无论怎么更新代码都不行。 原因&#xff1a; 在上一次上传代码的时候&#xff0c;我把我分…

YOLOv9改进|使用AKConv改进RepNCSPELAN4

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 AKConv是一种具有任意数量的参数和任意采样形状的可变卷积核&#xff0c;对不规则特征有更好的提取效果。 RepNCSPELAN4是YOLOv9中的…

JAVA的学习日记

JAVA的学习日记&#xff08;2024.3.1&#xff09;&#xff08;b站韩顺平老师课程学习笔记版&#xff09; ps:捡起忘光光的Java语言 Sublime //1. public是公有&#xff0c;class是类 //2. public class Hello表示Hello是一个类&#xff0c;是一个public公有的类 //3. Hello{…

【框架】MyBatis 框架重点解析

MyBatis 框架重点解析 1. MyBatis 执行流程 会话工厂生产的 SqlSession 对象提供了对数据库执行SQL命令所需的所有方法&#xff0c;包括但不限于以下功能&#xff1a; 数据库操作&#xff1a;SqlSession可以执行查询&#xff08;select&#xff09;、插入&#xff08;insert&a…

桥接模式(Bridge Pattern) C++

上一节&#xff1a;适配器模式&#xff08;Adapter Pattern&#xff09; C 文章目录 0.理论1.组件2.使用场景 1.实践 0.理论 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它的核心思想是将抽象部分与其实现部分分离&#xff0c;使它们可…

liunx安装jdk、redis、nginx

jdk安装 下载jdk,解压。 sudo tar -zxvf /usr/local/jdk-8u321-linux-x64.tar.gz -C /usr/local/ 在/etc/profile文件中的&#xff0c;我们只需要编辑一下&#xff0c;在文件的最后加上java变量的有关配置&#xff08;其他内容不要动&#xff09;。 export JAVA_HOME/usr/l…

操作系统系列学习——多进程图像

文章目录 前言多进程图像 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈工大】…