Python 3中GET请求无响应,代码仅打印指定请求信息问题排查
排查Python requests发送GET请求仅输出请求头无响应的问题
看起来你遇到了一个典型的请求卡住的问题——用Python 3的requests库发送GET请求时,只看到了底层socket发送请求头的debug日志,但目标网站完全没有响应。先看看你提供的代码片段:
import requests import logging try: import http.client as http_client except ImportError: # Python 2 import httplib as http_client http_client.HTTPConnection.debuglevel = 1 # You must initialize logging, otherwise you'll not see debug out...
下面我来分析可能的原因和对应的解决办法:
可能的原因
- 日志配置缺失:你开启了
http.client的debuglevel,但没有完成Python logging模块的初始化,导致只能看到请求发送的日志,完全看不到后续的连接状态、响应接收、超时等关键信息,没法定位到底卡在哪一步。 - 反爬机制拦截:目标站
flowersbay.ru可能识别出你使用的是python-requests/2.18.4这个默认UA,直接拒绝了连接或者故意不返回响应。 - 网络/服务器问题:你的网络到目标服务器的路由存在阻塞,或者目标服务器暂时宕机、资源已被删除,也可能是本地防火墙/代理拦截了请求。
- 请求头不完整:直接请求图片资源时,部分网站会要求携带
Referer、Cookie等请求头,否则不会返回内容。
解决步骤
1. 完善日志配置,获取完整请求流程
先补全日志初始化代码,这样能看到所有网络交互细节,帮你判断问题出在哪:
import requests import logging try: import http.client as http_client except ImportError: import httplib as http_client # 初始化logging,开启DEBUG级别日志 logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) # 开启requests和urllib3的DEBUG日志 requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True http_client.HTTPConnection.debuglevel = 1 # 发送请求的代码 target_url = "http://flowersbay.ru/images/cms/thumbs/818029804609cbb6501795d736843e86c5e0051b/yacshik_orange_flowersbay1_370_370.jpg" try: response = requests.get(target_url) print("响应状态码:", response.status_code) except Exception as e: print("请求出错:", str(e))
运行后你会看到更详细的日志,比如是否成功建立TCP连接、是否收到服务器的响应头,还是卡在了等待响应的环节。
2. 模拟浏览器请求头,规避反爬
把请求头改成浏览器的样式,比如Chrome的UA,再加上Referer字段模拟正常浏览行为:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "http://flowersbay.ru/" # 模拟从网站主页跳转至图片的请求 } try: response = requests.get(target_url, headers=headers, timeout=10) print("响应状态码:", response.status_code) except Exception as e: print("请求出错:", str(e))
大多数反爬机制会优先检查UA和Referer,这样修改后大概率能绕过基础拦截。
3. 添加超时设置,避免无限等待
给请求加上超时时间,这样如果服务器长时间无响应,会直接抛出超时异常,不会一直卡住:
# 这里设置10秒超时,你可以根据需要调整 response = requests.get(target_url, headers=headers, timeout=10)
如果抛出Timeout异常,说明服务器没有在规定时间内响应;如果是ConnectionError,则是无法建立连接,可能是网络或服务器的问题。
4. 手动验证资源可用性
先在浏览器里直接打开这个图片URL,看看能不能正常加载:
- 如果浏览器也打不开,那就是目标网站的问题(资源被删除、服务器宕机等),和你的代码无关;
- 如果浏览器能打开,那就是你的请求头或者爬虫特征被识别了,继续调整请求头即可。
内容的提问来源于stack exchange,提问作者Anna Kuzmina
相关产品推荐
相关产品推荐

