Python requests发起HEAD请求返回错误Content-Type与404、curl正常如何解决
问题原因分析
- 核心原因是目标站点服务器未对HEAD请求做兼容处理:多数CDN或后端服务仅实现了常用的GET、POST请求逻辑,收到HEAD请求时会直接返回404错误或错误的响应头,你用curl默认发送的是GET请求,因此可以拿到正确的Content-Type。
- 次要可能原因:requests默认的
User-Agent标识为python-requests/版本号,部分站点会拦截该UA,而curl默认会携带自身的UA标识,不会被拦截。
解决方法
推荐使用GET请求+流式传输的方案,既可以避免HEAD请求不兼容的问题,又不需要下载完整的CSV文件,只获取响应头即可,性能和HEAD请求一致:
import requests url = "https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.../OECD?contentType=csv&detail=code&separator=comma&csv-lang=en" # 设置stream=True时,requests只会先拉取响应头,不会立即下载响应体 r = requests.get(url, stream=True) # 先判断请求是否成功 if r.status_code == 200: header_dict = r.headers print(header_dict.get("Content-Type")) # 用完主动关闭连接,避免占用资源 r.close()
如果仍要尝试使用HEAD请求,可以手动把UA修改为curl的UA,部分情况下可以解决UA拦截的问题:
import requests url = "https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.../OECD?contentType=csv&detail=code&separator=comma&csv-lang=en" headers = { "User-Agent": "curl/7.68.0" # 和你本地curl的版本保持一致即可 } r = requests.head(url, headers=headers) print(r.status_code) print(r.headers.get("Content-Type"))
内容的提问来源于stack exchange,提问作者Jana
相关产品推荐
相关产品推荐

