使用Python Requests发送HTTP请求失败,请求协助排查
问题:使用requests访问HTTP站点超时,无法检测HTTPS重定向
我用Python的requests模块访问HTTPS网站完全正常,但访问HTTP站点(比如http://www.google.com)时出现超时失败。本来预期这个HTTP地址会重定向到HTTPS版本并返回对应状态码,但现在没法完成检测HTTP站点是否重定向到HTTPS的脚本开发。
正常运行的HTTPS请求代码
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' } url = "https://www.google.com" r = requests.get(url, headers=headers) print(r.status_code)
请求失败的HTTP代码
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' } url = "http://www.google.com" r = requests.get(url, headers=headers) print(r.status_code)
错误信息
sock.connect(sa) TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='www.google.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001D3A496A9A0>: Failed to establish a new connection: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败'))
解决建议
- 检查网络与端口连通性:很多地区的运营商可能屏蔽了HTTP默认的80端口,或者本地防火墙、安全软件拦截了HTTP请求。可以在命令行执行
telnet www.google.com 80测试是否能建立连接,确认目标站点80端口是否对外开放。 - 给请求添加超时与重定向配置:requests默认自动跟随重定向,但可以显式配置并设置超时时间,避免无限等待。修改代码如下:
import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' } url = "http://www.google.com" try: # 设置10秒超时,允许自动重定向 r = requests.get(url, headers=headers, allow_redirects=True, timeout=10) print("状态码:", r.status_code) print("最终跳转地址:", r.url) except requests.exceptions.RequestException as e: print("请求出错:", str(e))
- 更换DNS服务器:如果DNS解析异常,会导致无法正确定位HTTP站点的服务器。可以尝试切换到公共DNS(比如1.1.1.1或8.8.8.8)后再重新测试。
- 禁用代理:如果系统或requests配置了代理,代理可能不支持HTTP请求。可以在请求中显式禁用代理:
r = requests.get(url, headers=headers, proxies={"http": None, "https": None}, timeout=10)
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

