Windows 11上Python requests请求正常,Ubuntu虚拟机返回404错误
问题排查与解决方案
可能的原因及对应排查步骤
1. 网络解析与代理差异
虽然虚拟机用桥接模式,但Windows和Ubuntu的DNS解析结果、代理设置可能存在差异,导致请求路由到不同的Twitter节点:
- 检查DNS解析:在Ubuntu终端执行
nslookup twitter.com,和Windows命令行的结果对比。如果不一致,手动将Ubuntu的DNS服务器设置为和Windows相同(比如8.8.8.8),修改/etc/resolv.conf或者通过系统设置调整。 - 检查系统代理:执行
echo $http_proxy和echo $https_proxy,确认Ubuntu没有自动启用未配置的代理。如果有,清空代理环境变量:unset http_proxy https_proxy,再重新运行代码。
2. 请求头/ Cookie的细微差异
Requests库在不同系统下可能自动添加不同的默认请求头(比如Accept-Encoding),或者Cookie的生效逻辑有差异:
- 完全对齐请求头:用抓包工具(如Fiddler)抓取Windows下成功请求的所有请求头,把这些头全部手动添加到Ubuntu代码的
session.headers中,覆盖requests的默认值。比如补充Accept-Encoding: gzip, deflate, br这类可能缺失的头。 - 验证Cookie生效:在Ubuntu代码中添加
print(session.cookies),确认auth_token和ct0的domain、path、值都正确,确保请求时Cookie被正确携带。
3. TLS/SSL版本兼容性
Windows和Ubuntu的OpenSSL版本不同,导致TLS握手时使用的协议版本不一致,触发Twitter的节点限制:
- 强制指定TLS版本:在代码中添加适配器,强制使用TLS 1.2(和Windows环境一致):
添加后再运行请求测试。import ssl from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class TLSAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 ) session.mount('https://', TLSAdapter())
4. 虚拟机网络特征被识别
Twitter可能通过网卡MAC地址等特征识别出虚拟机环境,进行了访问限制:
- 修改虚拟机MAC地址:在VMware的虚拟机设置中,找到网络适配器,选择“手动”指定MAC地址,替换为非VMware默认前缀的地址(比如开头改为
00:1A:2B:),重启虚拟机网络后重新测试。
内容的提问来源于stack exchange,提问作者Flo Rentin
相关产品推荐
相关产品推荐

