requests.get在Linux冻结/超时,urllib.request.urlopen正常,求调试建议
这问题我之前碰到过类似的,跨平台下requests和urllib的行为差异通常和请求细节、系统环境有关,给你几个具体的调试方向:
调试与排查建议
1. 对齐请求头参数
requests和urllib默认的请求头(尤其是User-Agent)不一样,很多网站会针对不同请求头做差异化处理,甚至对requests的默认UA做限流。你可以先分别打印两个库发送的请求头:
- 用requests打印请求头:
import requests resp = requests.get("目标网站URL") print(resp.request.headers)
- 用urllib打印请求头:
from urllib.request import Request, urlopen req = Request("目标网站URL") resp = urlopen(req) print(req.headers)
然后把requests的请求头改成和urllib完全一致,再在Linux环境测试,看是否还会出现冻结/超时问题。
2. 排查SSL/TLS版本差异
Windows和Linux系统的OpenSSL版本可能不同,requests依赖urllib3和底层SSL库,而urllib可能调用的是系统自带的不同实现。你可以:
- 在两边环境分别运行
python -c "import ssl; print(ssl.OPENSSL_VERSION)"对比版本 - 强制requests使用特定TLS版本,比如指定TLSv1.2:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl class TLSAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): kwargs['ssl_version'] = ssl.PROTOCOL_TLSv1_2 return super().init_poolmanager(*args, **kwargs) session = requests.Session() session.mount('https://', TLSAdapter()) try: resp = session.get("目标网站URL", timeout=10) print(resp.status_code) except Exception as e: print(f"Error: {e}")
试试切换TLS版本(比如TLSv1.3),看是否能解决问题。
3. 开启requests调试日志
通过日志可以追踪请求的每一步,定位到底是卡在DNS解析、TCP连接还是等待响应阶段:
import logging import requests # 开启DEBUG级别的日志 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') try: requests.get("目标网站URL", timeout=10) except Exception as e: print(f"最终错误: {e}")
日志会输出DNS查询、连接建立、请求发送的细节,帮你快速定位卡点。
4. 检查Linux系统网络配置
Linux的网络环境可能有代理、防火墙、DNS缓存等差异:
- 检查是否有全局代理:执行
echo $HTTP_PROXY和echo $HTTPS_PROXY,对比Windows环境的代理设置 - 测试DNS解析:用
nslookup 目标网站域名在Linux上执行,看解析结果和Windows是否一致 - 测试端口连通性:用
telnet 目标网站IP 443(HTTPS端口)或telnet 目标网站IP 80(HTTP端口),确认Linux能正常连接到目标服务器
5. 调整连接池与超时设置
requests默认使用连接池,而urllib默认是单次连接,这种差异也可能导致问题:
- 禁用requests的连接池:
session = requests.Session() session.keep_alive = False resp = session.get("目标网站URL", timeout=10)
- 拆分timeout参数:把requests的timeout拆成连接超时和读取超时的元组,比如
timeout=(3, 10)(3秒连接超时,10秒读取超时),避免因单一超时设置导致误判
内容的提问来源于stack exchange,提问作者Olaf
相关产品推荐
相关产品推荐

