You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:23:25