如何解决tls_client库下载图片后无法打开的问题?
解决tls_client下载图片无法打开的问题
你的问题出在客户端标识(client_identifier)与手动设置的User-Agent版本不匹配,导致服务器返回了非图片格式的内容。
原因分析
tls_client的client_identifier参数会自动生成对应浏览器版本的TLS指纹和默认请求头。你指定了firefox113作为客户端标识,但手动设置的User-Agent是Firefox 101的版本,这种不匹配可能被服务器识别为异常请求,返回的不是图片数据,因此下载的文件无法打开。而requests库没有严格的TLS指纹校验逻辑,所以能正常获取图片。
修复方案
有两种可行的修复方式:
方式1:移除自定义headers,让session自动生成匹配的请求头
直接使用client_identifier对应的默认请求头,避免版本不匹配:
import tls_client image_link = 'https://cdn.pixabay.com/photo/2016/11/29/12/13/fence-1869401_960_720.jpg' # 使用firefox113的客户端标识,session会自动生成匹配的User-Agent等请求头 session = tls_client.Session(client_identifier="firefox113") response = session.get(image_link) print(response.status_code) # 验证返回内容类型(可选) print(response.headers.get('Content-Type')) # 应输出image/jpeg with open("image.jpg", "wb") as f: f.write(response.content)
方式2:保持client_identifier与User-Agent版本一致
如果你需要保留自定义的User-Agent,将client_identifier改为对应版本的标识:
import tls_client image_link = 'https://cdn.pixabay.com/photo/2016/11/29/12/13/fence-1869401_960_720.jpg' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0', } # 客户端标识改为与User-Agent匹配的firefox101 session = tls_client.Session(client_identifier="firefox101") response = session.get(image_link, headers=headers) print(response.status_code) with open("image.jpg", "wb") as f: f.write(response.content)
验证步骤
执行代码前可以先添加以下验证逻辑,确认返回的是图片内容:
print(len(response.content)) # 正常图片大小应该在几十KB到几百KB之间 print(response.headers.get('Content-Type')) # 正确值为image/jpeg
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

