Python中requests库请求网址出错怎么办?
import requests
url = ‘https://www.asqql.com/html_zuanti/index_2.html’
res = requests.get(url, verify=False)
res.encoding=‘gb2312’
print(res.text)
报错:requests.exceptions.SSLError: HTTPSConnectionPool(host=‘www.asqql.com’, port=443): Max retries exceeded with url: /html_zuanti/index_2.html (Caused by SSLError(SSLError(“bad handshake: SysCallError(-1, ‘Unexpected EOF’)”,),))
有朋友遇到过这个问题吗,怎么解决呢
Python中requests库请求网址出错怎么办?
requests.get( https_url, verify=False)
遇到requests库请求网址出错,先别慌,按这个顺序排查,基本能解决90%的问题。
1. 先看报错信息 这是最重要的!把完整的Traceback贴出来。常见的错误类型有:
ConnectionError/Timeout: 网络问题或服务器没响应。加个timeout参数试试:requests.get(url, timeout=5)HTTPError(如404, 500): 服务器返回了错误状态码。用response.raise_for_status()主动抛出异常,或者检查response.status_code。SSLError: HTTPS证书问题。临时测试可以加verify=False参数,但生产环境别这么干。TooManyRedirects: 重定向太多。检查URL是否正确,或用allow_redirects=False禁止重定向。InvalidURL: URL格式不对。
2. 检查请求本身 用下面这个代码把请求详情打印出来,看看和你预想的是否一致:
import requests
response = requests.get('http://httpbin.org/get')
print(f"最终URL: {response.url}")
print(f"状态码: {response.status_code}")
print(f"请求头: {response.request.headers}")
print(f"响应头: {response.headers}")
3. 模拟浏览器请求 很多网站反爬。加上User-Agent等常见头信息:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
4. 处理重定向和Cookies 有些登录或会话需要保持状态:
session = requests.Session()
session.get(login_url) # 先访问登录页获取cookies
response = session.get(target_url) # 用同一个session访问目标页
总结:先看报错,再查请求细节,最后考虑反爬和会话问题。
一样的, 已知解决方案为:开启 fiddler 捕获情况下发起 requests 请求, 可以正常返回响应体, 想找找有没有更人性化的解决方案
把 fiddler 关掉再运行一下试试
如何删除回复啊,看错了
关掉就报 SSLError 了, 更像是借助了 fiddler 证书才能正常请求, 这也是我无意中测试出来的
TLS 1.3 No
TLS 1.2 No
TLS 1.1 No
TLS 1.0 Yes
SSL 3 INSECURE Yes
SSL 2 INSECURE Yes
https://www.ssllabs.com/ssltest/analyze.html?d=www.asqql.com
较新版本的 OpenSSL 已经把有漏洞的 Cipher 全部禁用了,所以 TLS 1.0 以下的所有 Cipher 都无法匹配上。
Chrome 能打开是因为 Chrome 还允许最后一个 Weak Cipher:
TLS_RSA_WITH_3DES_EDE_CBC_SHA DES-CBC3-SHA
# TLS 1.0 (suites in server-preferred order)
TLS_RSA_WITH_RC4_128_MD5 (0x4) INSECURE 128
TLS_RSA_WITH_RC4_128_SHA (0x5) INSECURE 128
TLS_RSA_WITH_3DES_EDE_CBC_SHA (0xa) WEAK 112
TLS_RSA_WITH_DES_CBC_SHA (0x9) INSECURE 56
TLS_RSA_EXPORT1024_WITH_RC4_56_SHA (0x64) INSECURE 56
TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA (0x62) INSECURE 56
TLS_RSA_EXPORT_WITH_RC4_40_MD5 (0x3) INSECURE 40
TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 (0x6) INSECURE 40
The connection to this site uses TLS 1.0 (an obsolete protocol), RSA (an obsolete key exchange), and 3DES_EDE_CBC with HMAC-SHA1 (an obsolete cipher).
requests.get 请求也有用到 OpenSSL,在爬取 TLS 加密的 HTTPS 网页的时候,所以如果待爬取网站的 TLS 版本过低不被 OpenSSL 支持的话,也是会失败报错的。
用 NGINX 反代?
fiddler 自带证书,所以你 python 发出去没有证书的包 fiddler 给你加了,verify=False 是关闭 https 认证,某些网站可用,如果网站强制 ssl 的话可以 import certifi 或者 import ssl,有问题可以先百度一下,关键字“ python ssl ”
请求地址的https改为http试一下
msg7086 的回答才是正解, 我再补充一点, 出现这个错误的根本原因是那个网站 使用的 3DES Cipher 不够安全, 已经被很多库禁用了。除了新版本的 OpenSSL 已经禁用了 3DES 外, 对于老版本的 OpenSSL, requests 本身在 2.11.1 之后, 也禁用了 3DES。如果你的 OpenSSL 版本较老, 可以用下面的方法绕过(或降级 requests )
https://lukasa.co.uk/2017/02/Configuring_TLS_With_Requests/
谢谢大家的详细解答

