AWS EC2 Windows实例Python requests请求无终止问题排查求助
我之前碰到过类似的场景——单一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

