Python 的 http 请求疑惑

227 天前
 jianyang

我的 python 版本是 3.11.1, 用 requests 或者 httpx 做 http 请求时经常遇到 ssl 错误,忽略证书验证就会提示一大串警告,或者就是直接超时,正常时不可能超时的,不知道这个时间消耗在了哪里,不知道是不是还是 ssl 的问题,搞不懂 python 的 ssl 到底要怎么搞

不知道是个例还是大家都一样、还是需要配置哪里我没搞对

同样的地址和请求方式我用 GO 从来没遇到过超时和稀奇古怪的问题,没一点毛病

有时候临时写个小脚本想用 python 快速写一下,用完就删了,就会出现上面的毛病,本来很简单的事要搞好久,有时候还是用 GO 再重写一遍。。。

2252 次点击
所在节点    Python
28 条回复
forQ
227 天前
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

这个?
jianyang
227 天前
@forQ 这个是关闭了 ssl 的警告信息,对请求没有改善. 超时,好像还有 SSL 直接报错的情况
zzl22100048
227 天前
具体是访问那个网址? 3.11 默认配置对证书更严格,你可以自定义 sslcontext ,或者不校验证书
lambdaq
227 天前
AlanStar
227 天前
OP 这个问题有这么几个可能。
1.开了代理,CFW 之类的,我的 py 运行的时候有时候会受代理的影响,如果你需要让 py 的请求过代理,可以这么写。
以 requests 为例:my_proxy = {‘https’: '127.0.0.1:7890'} requests.get(url, proxies=my_proxy)。其中那个 dict 的地址按照自己实际情况来写。
2.缺少 urllib3 这个库,你可以用 pip 安装一下,我是在部署云函数(3.10)的时候发现了类似的问题,安装了之后就不会报错了

如果可以的话放一下代码和报错信息
hackpro
227 天前
我也是经常碰到这个 恶心的不行🤢

特意安装了 GUI 版本的
运行 Install Certificates.command 也不行
有些是直接安装 prebuilt binary ,比如 yt-dlp 一堆 ssl error
jianyang
227 天前
@zzl22100048
没有特定的地址,感觉好多都会🙁

@lambdaq
一半都是 verify=False 总不能为了发个 HTTP 请求还去倒个证书用吧

@AlanStar
是开了代理、我 Surge 常挂,不过我用 pycharm 启动的是走不了代理的,urllib3 这个库也装了,好像装 requests 的时候就会一起装上


奇怪的问题主要是 SSL 偶尔会直接报错,确定设置了 verify=False
再就是莫名其妙的超时,我也说不清是不是超时,我感觉像,但是 err 信息是空白,正常来讲访问的地址是不可能超时的
lambdaq
227 天前
@jianyang connect timeout read timeout 之类的设置小一点,总有一个出错的。
jianyang
227 天前
@lambdaq 我一般设置 timeout=(10,10)
请求的时候有时候感觉也确实等了有 10 秒左右,就 err 了,但是 err 信息是""
但是请求的地址正常是不可能耗时 10 秒不返回的,正常 1-2S 就返回了
lambdaq
227 天前
@jianyang 设置成 (0,5, 10) 和 (10, 1) 看看到底哪个环节出的问题。目测应该是 dns 查挂了。
jianyang
227 天前
@lambdaq
如果是 DNS 挂了那为啥当时我马上用 GO 重写一遍就没一点问题,好几次了都是 python 写完再用 GO 重写一遍。。。
AlanStar
227 天前
@jianyang “urllib3 这个库也装了,好像装 requests 的时候就会一起装上”这个确实,但是最好手动装一下确认一下,我云函数那个 case 就是,在本地确认有这个库存在,但是一传到云端就出问题,重新装一下就好了。
我记得好像 pycharm 是调的 powershell ,好像是默认走代理的吧,Surge 我没用过,具体看 OP 自己的情况了
jianyang
227 天前
@AlanStar 嗯嗯、也感谢你的回答
Outclass
227 天前
我认为就是代理的问题,见知乎文章 https://zhuanlan.zhihu.com/p/350015032
可以在 requests 请求中添加代理参数 requests.get(url, proxies=my_proxy)
我一般会直接在代码开头设置环境变量也能解决
os.environ['http_proxy'] = 'http://127.0.0.1:7890'
os.environ['https_proxy'] = 'http://127.0.0.1:7890'
一般情况下,我是在系统变量中直接添加代理环境变量 HTTP_PROXY=http://127.0.0.1:7890 ,HTTPS_PROXY=http://127.0.0.1:7890 ,不过这就需要代理软件一直打开了
此外,由于代理这个问题也可能导致 pip 下载失败(用到 urilib3 库),反正就很搞
Vegetable
227 天前
这 9 成是代理问题,下次遇到你可以试试禁用代理的方案,或者先关掉所有网络科技。
sky96111
227 天前
有同样的疑惑,出现在 Python 编写的包管理器 dnf 上,切换代理经常导致整个 dnf 程序没有一点输出 hang 住 40 多秒
sky96111
227 天前
@sky96111 (注:不是指在程序运行时切换代理,是程序 hang 住这个时间段曾经有切换代理的操作
maocat
227 天前
#15 可能是 pycharm 代理问题,我用 langchain 请求 chatgpt api ,明明没有配置代理,却能通(本机开了代理),可以试试打包到服务器上看看
julyclyde
226 天前
@sky96111 hang 住期间切换应该是不会影响环境变量的
环境变量是“一次性”的
sky96111
226 天前
@julyclyde 不是在 dnf 运行时切换代理,是切换代理容易导致出现这个问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/977909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX