百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Python爬虫中可能遇到的TSL/JA3指纹问题

toyiye 2024-07-26 22:03 21 浏览 0 评论

在排除了协议的问题后,有些情况下,我们的headers也是设置正确的,仍然没办法取得数据,这又是为何呢?

问题呈现:

例如,在获取某图片网站的数据的时候,直接采用requests请求,并没有获取到相应的数据。在这个例子中,我并没有往headers中添加更多的内容,其实之前尝试过,后来发现,实际上并不需要。

import requests

url = "https://p****y.com/zh/illustrations/search/%e8%87%aa%e7%84%b6/"

headers = {
    'User-Agent':'Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',    
}

req = requests.get(url,headers=headers)

print(req.text)
print(req.status_code)

请求结果(状态码为403,而且返回的内容中没有我们需要的内容):

其次怀疑可能是协议的问题,改用httpx重新请求,其结果也是一致的(代码略,可以参考上篇内容)

那么,为什么headers正确,请求不到数据?我们改用postman请求试试。

是可以正常请求到数据的,而且并没有携带过多的参数。

问题成因,可能是TSL/JA3:

JA3指纹(JA3 fingerprint)是一种用于网络流量分析的技术,旨在识别和分类不同的TLS(Transport Layer Security)客户端。TLS是一种常用于加密互联网通信的协议,它提供了安全的数据传输和身份验证机制。

JA3指纹通过分析TLS握手阶段中客户端和服务器之间交换的握手消息来创建一个唯一的指纹。在TLS握手期间,客户端和服务器交换一系列的握手消息,包括支持的TLS版本、密码套件、压缩算法和TLS扩展等信息。JA3指纹将这些消息中的特定字段进行哈希处理,生成一个字符串来表示客户端的TLS配置。

由于不同的TLS客户端在握手消息中的字段值可能会有所不同,因此它们生成的JA3指纹也会有所不同。这使得JA3指纹可以用于识别和区分不同类型的TLS客户端,例如Web浏览器、移动应用程序、恶意软件等。

通过分析网络流量中的JA3指纹,安全分析人员和网络管理员可以检测和识别异常的TLS行为、恶意软件的活动或者潜在的网络攻击。然而,值得注意的是,JA3指纹并非绝对可靠,因为攻击者可以通过更改TLS。

引用自:逆向之Ja3指纹学习 - 始識 - 博客园

正常浏览器与requests发起请求的TSL/JA3差异:

这个网站可以展示当前请求的TSL信息:https://tls.browserleaks.com/json

正常用浏览器访问:

用代码请求:

import requests

url = "https://tls.browserleaks.com/json"

headers = {
    'User-Agent':'Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',    
}

req = requests.get(url,headers=headers)

print(req.text)
print(req.status_code)

可见结果存在明显差异,也就是说可以通过检查ja3直接拒绝某些访问,尤其是最后两项,使用代码请求直接是空的。

解决:修改TSL/JA3指纹

使用requests库去完成这个事情是有些费劲的,但是已经有可以做到这个事情的工具:curl_cffi

使用之前先安装:

pip install curl_cffi

看一看指纹:

from curl_cffi import requests

url = "https://tls.browserleaks.com/json"

headers = {
    'User-Agent':'Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',    
}

req = requests.get(url,headers=headers,impersonate='chrome')

print(req.text)
print(req.status_code)

请求结果:

使用curl_cffi尝试请求我们的数据:

from curl_cffi import requests

url = "https://p****y.com/zh/illustrations/search/%e8%87%aa%e7%84%b6/"

headers = {
    'User-Agent':'Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',    
}
req = requests.get(url,headers=headers,impersonate='chrome')

print(req.text)
print(req.status_code)

已经可以正常请求到数据,并且响应代码为200。

如果遇到更为严谨的TSL/JA3检查,那还需要更为严谨的修改方式,使得通过代码的访问行为与浏览器访问的行为一致。

相关推荐

「编程」Java GUI 基础(java编程语言基础)

图形化学习是外功,内功外功配合才能所向披靡。一、JFrameJAVASWING导入包importjavax.swing.*导入包importjava.awt.*JFrameframe=new...

这六个Java技术当年是多么风光,而现在又有几个人用过

嗨,雷猴啊,今天我给大家分享下我的开发历程中,我知道的那些被淘汰的技术或者框架。不知道你们都知道吗?也不知道你们都有没有用过,但是它们之前都是风靡一时,让我们再来了解一次吧。偷偷告诉大家有些我甚至都没...

开发第一个Swing程序(开发第一个java程序实验报告)

packagecom.web.www;importjavax.swing.*;/**第一个Swing程序*/publicclassSwing1extendsJFrame{publicSw...

Java课程设计项目实例《远程屏幕分享监视》第2部分

Java课程设计项目实例《远程屏幕分享监视》第2部分1、服务器端ScreenMonitoringServer程序类及相关的功能方法的编程实现(1)创建出服务器端的ScreenMonitoringSer...

新手学Java编程语言怎么入门?知识点都帮你整理好了

新手学Java编程语言怎么入门?下面和千锋广州小编一起来看看吧!掌握语言基础是第一步,了解Java基础知识,Java关键字、核心概念或者基本编码技术。掌握操作符、控制执行流程、访问权限控制、复用类、多...

Java Swing组件“HelloWorld”程序演示实例

Java源代码:/*首先导入Swing需要的包*/importjavax.swing.*;importjavax.swing.UIManager;importjava.awt.*;import...

新年Java小游戏之「年兽大作战」祝您笑口常开

这个游戏加上编写文章,上班摸鱼时间加上回家的空闲时间,大概花了三天多。java写这玩应真的很痛苦,各种状态位,各种图片和逻辑判断,脑袋都快炸了。而且肯定没有前端的精致,效果一般,偶尔会有卡顿,各位就图...

10分钟掌握 JMeter接口测试的基础入门

嘿。大家好,我是4U:...

JMeter 的简单安装说明(jmeter安装配置)

最近在做一组性能测试,接触到了JMeter这个测试工具,在这里记录一下JMeter的介绍以及简单安装过程。JMeter简介...

Jmeter压测实例分享——新手儿也能一学就会!

JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java...

过年必备Java动态烟花教程如何用Canvas和Timer实现炫酷烟花动画

烟花是一种常见的庆祝活动和节日的方式,它们在夜空中绽放出各种颜色和形状,给人们带来美丽和欢乐。你是否想过用Java编程来模拟烟花的效果呢?如果你对此感兴趣,那么这篇教程就是为你准备的。在这篇教程中,你...

全程软件测试(九十五):Jmeter技能基础—读书笔记

jmeter是一款优秀的开源性能测试工具,目前最新版本3.0版本,官网文档地址:http://jmeter.apache.org/usermanual/index.html一、优点...

原创 JAVA Swing JFrame窗口的建立

importjava.awt.*;importjavax.swing.*;publicclassExample1extendsJFrame{//定义一个类继承JFrame类public...

Java Swing组件下的JComboBox组件实例

运行成功的界面:java源代码:一定要注意:执行环境(JRE)javaSE-1.8/*首先导入JButtontest所需要的包*/importjavax.swing.*;importjavax.s...

Java引包的几种方法(java 引用)

第一种方法可以在Superclass这里输入javax.swing.JFrame进行引包也可以在类体外面输入importjavax.swing.JFrame;进行引包还可以点击JFrame然后点击I...

取消回复欢迎 发表评论:

请填写验证码