背景介绍
前段时间做了一个看似很简单的需求,即爬取百度搜索内容,例如通过百度搜索“JA3指纹”。在编写程序测试过程中,发现无法正常采集到搜索结果。如下代码通过python requests工具访问百度搜索请求,会被百度安全验证拦截下来。
import requests
res = requests.get("https://www.baidu.com/s?wd=ssl%E6%8C%87%E7%BA%B9",
headers = {
"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.9",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
)
res.encoding = "utf-8"
print(res.text)
但通过以下 curl 语句能够正常访问百度搜索结果。
curl 'https://www.baidu.com/s?wd=ssl%E6%8C%87%E7%BA%B9' \
-H '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.9' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' \
--compressed
那么在目标网站、请求头、请求参数都相同的情况下,curl 与 requests 在网络请求过程中还有什么不同呢?由此引出本文介绍的对象“JA3指纹”(也称作SSL指纹、TLS指纹)。
什么是 JA3 指纹
JA3 指纹于2017年6月首次发布在 GitHub 上,是 Salesforce 研究人员 John Althouse、Jeff Atkinson和Josh Atkins 的作品。简单来说,JA3 是一种从 SSL/TLS Client Hello 数据包中提取字段并生成指纹用以识别特定客户端的技术,它于它不会随着客户端更换 IP 或者 User-Agent 而改变。JA3 指纹从一开始就说明客户端应用程序是否存在恶意。
JA3 是怎么生成的
回顾一下 https 建立连接的过程,能更直观的感受到 JA3 指纹是在什么位置生成的。