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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:09:51