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

AWS EC2 Windows实例Python requests请求无终止问题排查求助

调试AWS EC2 Windows实例中Python requests.get卡住的问题

我之前碰到过类似的场景——单一URL在requests里卡主,但浏览器能正常访问,其他URL也没问题,这种情况大多是requests库和系统环境的适配细节问题,咱们一步步来排查:

  • 先给请求加超时限制,避免无限等待
    首先给get请求加上超时参数,这样至少能终止请求并拿到错误提示,帮你定位是连接阶段还是数据接收阶段出了问题:

    import requests
    requests.get('http://some_picture_url', timeout=10)
    
  • 开启requests调试日志,追踪请求全流程
    开启DEBUG级别的日志,能看到请求从DNS解析到响应接收的每一步细节,直接定位卡壳的环节:

    import logging
    import requests
    
    logging.basicConfig(level=logging.DEBUG)
    requests.get('http://some_picture_url', timeout=10)
    

    比如如果日志卡在"Waiting for response",大概率是服务器对requests的请求头有拦截;如果卡在"Connecting to...",就要排查底层网络连接问题。

  • 校验代理设置的差异
    Windows的IE可能自动使用了系统代理,但requests默认不会读取系统代理配置。你可以试试让requests复用系统代理,或者手动指定代理:

    import requests
    from requests.utils import get_environ_proxies
    
    # 获取系统代理
    proxies = get_environ_proxies('http://some_picture_url')
    response = requests.get('http://some_picture_url', proxies=proxies, timeout=10)
    

    或者直接把IE里的代理地址填进去测试:proxies={"http": "http://your-proxy-ip:port"}

  • 模拟浏览器请求头,绕过UA拦截
    部分服务器会校验请求的User-Agent字段,拒绝非浏览器的请求。你可以把IE的UA字符串复制过来加到请求里:

    import requests
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
    }
    requests.get('http://some_picture_url', headers=headers, timeout=10)
    

    你可以从IE的开发者工具(F12)里拿到自己实例上的准确UA。

  • 排查证书与TLS版本兼容性
    哪怕你用的是HTTP协议,目标URL可能会自动跳转至HTTPS,而Python3.6.3配套的urllib3版本较旧,对新的TLS版本支持有限。可以先临时关闭证书验证(仅调试用,生产环境禁止):

    requests.get('http://some_picture_url', verify=False, timeout=10)
    

    如果有效,建议升级requests和urllib3到兼容版本:

    pip install --upgrade requests urllib3
    

    注意要以管理员权限打开命令提示符执行升级操作。

  • 用底层socket测试,排除requests库本身问题
    写个简单的socket请求直接和目标服务器交互,确认是requests的配置问题还是系统网络问题:

    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10)
    # 解析目标域名的IP
    target_ip = socket.gethostbyname('your-picture-domain.com')
    # 连接80端口
    s.connect((target_ip, 80))
    # 发送HTTP GET请求
    s.send(b'GET /path/to/your/picture HTTP/1.1\r\nHost: your-picture-domain.com\r\nConnection: close\r\n\r\n')
    # 接收响应
    response_data = s.recv(1024)
    print(response_data)
    s.close()
    

    如果这个socket请求能正常拿到响应,那问题肯定在requests的配置上;如果也卡住,就要检查EC2的安全组、NACL规则,或者目标服务器是否对EC2的IP做了拦截。

  • 检查EC2实例的网络规则
    虽然IE能访问,但还是要确认EC2安全组是否允许出站的80端口(HTTP),NACL是否配置了对应的出站允许规则。另外部分VPC环境下的EC2可能需要通过NAT网关访问外部,不过这种情况IE也会受影响,可能性较低,但可以排查一下。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:17:44