Python 的 http 请求疑惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jianyang
V2EX    Python

Python 的 http 请求疑惑

  •  
  •   jianyang 2023-09-28 13:50:51 +08:00 2990 次点击
    这是一个创建于 752 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    28 条回复    2023-09-30 11:02:42 +08:00
    forQ
        1
    forQ  
       2023-09-28 14:04:00 +08:00
    from requests.packages.urllib3.exceptions import InsecureRequestWarning
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

    这个?
    jianyang
        2
    jianyang  
    OP
       2023-09-28 14:08:02 +08:00
    @forQ 这个是关闭了 ssl 的警告信息,对请求没有改善. 超时,好像还有 SSL 直接报错的情况
    zzl22100048
        3
    zzl22100048  
       2023-09-28 14:16:54 +08:00
    具体是访问那个网址? 3.11 默认配置对证书更严格,你可以自定义 sslcontext ,或者不校验证书
    lambdaq
        4
    lambdaq  
       2023-09-28 14:20:12 +08:00
    AlanStar
        5
    AlanStar  
       2023-09-28 14:25:13 +08:00
    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
        6
    hackpro  
       2023-09-28 14:31:44 +08:00 via iPhone
    我也是经常碰到这个 恶心的不行

    特意安装了 GUI 版本的
    运行 Install Certificates.command 也不行
    有些是直接安装 prebuilt binary ,比如 yt-dlp 一堆 ssl error
    jianyang
        7
    jianyang  
    OP
       2023-09-28 14:40:01 +08:00
    @zzl22100048
    没有特定的地址,感觉好多都会

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

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


    奇怪的问题主要是 SSL 偶尔会直接报错,确定设置了 verify=False
    再就是莫名其妙的超时,我也说不清是不是超时,我感觉像,但是 err 信息是空白,正常来讲访问的地址是不可能超时的
    lambdaq
        8
    lambdaq  
       2023-09-28 14:47:12 +08:00
    @jianyang connect timeout read timeout 之类的设置小一点,总有一个出错的。
    jianyang
        9
    jianyang  
    OP
       2023-09-28 14:50:27 +08:00
    @lambdaq 我一般设置 timeout=(10,10)
    请求的时候有时候感觉也确实等了有 10 秒左右,就 err 了,但是 err 信息是""
    但是请求的地址正常是不可能耗时 10 秒不返回的,正常 1-2S 就返回了
    lambdaq
        10
    lambdaq  
       2023-09-28 15:07:06 +08:00
    @jianyang 设置成 (0,5, 10) 和 (10, 1) 看看到底哪个环节出的问题。目测应该是 dns 查挂了。
    jianyang
        11
    jianyang  
    OP
       2023-09-28 15:19:50 +08:00
    @lambdaq
    如果是 DNS 挂了那为啥当时我马上用 GO 重写一遍就没一点问题,好几次了都是 python 写完再用 GO 重写一遍。。。
    AlanStar
        12
    AlanStar  
       2023-09-28 15:48:13 +08:00
    @jianyang “urllib3 这个库也装了,好像装 requests 的时候就会一起装上”这个确实,但是最好手动装一下确认一下,我云函数那个 case 就是,在本地确认有这个库存在,但是一传到云端就出问题,重新装一下就好了。
    我记得好像 pycharm 是调的 powershell ,好像是默认走代理的吧,Surge 我没用过,具体看 OP 自己的情况了
    jianyang
        13
    jianyang  
    OP
       2023-09-28 15:53:14 +08:00
    @AlanStar 嗯嗯、也感谢你的回答
    Outclass
        14
    Outclass  
       2023-09-28 18:47:35 +08:00
    我认为就是代理的问题,见知乎文章 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
        15
    Vegetable  
       2023-09-28 19:25:17 +08:00
    这 9 成是代理问题,下次遇到你可以试试禁用代理的方案,或者先关掉所有网络科技。
    sky96111
        16
    sky96111  
       2023-09-28 20:01:06 +08:00 via Android
    有同样的疑惑,出现在 Python 编写的包管理器 dnf 上,切换代理经常导致整个 dnf 程序没有一点输出 hang 住 40 多秒
    sky96111
        17
    sky96111  
       2023-09-28 20:03:03 +08:00 via Android
    @sky96111 (注:不是指在程序运行时切换代理,是程序 hang 住这个时间段曾经有切换代理的操作
    maocat
        18
    maocat  
       2023-09-29 00:35:05 +08:00
    #15 可能是 pycharm 代理问题,我用 langchain 请求 chatgpt api ,明明没有配置代理,却能通(本机开了代理),可以试试打包到服务器上看看
    julyclyde
        19
    julyclyde  
       2023-09-29 12:43:19 +08:00
    @sky96111 hang 住期间切换应该是不会影响环境变量的
    环境变量是“一次性”的
    sky96111
        20
    sky96111  
       2023-09-29 13:16:03 +08:00 via Android
    @julyclyde 不是在 dnf 运行时切换代理,是切换代理容易导致出现这个问题
    julyclyde
        21
    julyclyde  
       2023-09-29 13:39:44 +08:00
    @sky96111 但是你刚才说的是“是程序 hang 住这个时间段曾经有切换代理的操“啊
    julyclyde
        22
    julyclyde  
       2023-09-29 13:40:01 +08:00
    @sky96111 dnf 是 C++的吧? yum 才是 python 的
    sky96111
        23
    sky96111  
       2023-09-29 13:44:12 +08:00 via Android
    @julyclyde 还没正式发布的 dnf5 才是 c++,yum 是 dnf 的 alias ,都是 python
    julyclyde
        24
    julyclyde  
       2023-09-29 13:59:12 +08:00
    @sky96111 我觉得你可能混淆了 yum3 和 yum4/dnf
    yum3 是 python 的; yum4 是指向 C++的 dnf 的 alias
    stonesirsir
        25
    stonesirsir  
       2023-09-29 14:06:00 +08:00 via Android
    有 ipv6 吗?强制 ipv4 ?
    julyclyde
        26
    julyclyde  
       2023-09-29 14:10:46 +08:00
    @sky96111 我查了一下资料,发现你说的情况以前确实是存在过的
    所以我觉得提到 yum 、dnf 的时候确实有必要说一下版本

    根据维基百科:
    DNF was originally written in Python, but as of 2016 efforts were under way to port it to C and move most functionality from Python code into the new libdnf library.[12] In 2018, the DNF team announced the decision to move libdnf from C to C++.

    在 RHEL8 之后,yum4 是 C++的 dnf 的别名;在 RHEL7 时代,yum 是一个纯 python 的东西,那时代 dnf 没有被引入
    RHEL 应该是没有用过 python 版本的 dnf 吧?
    sky96111
        27
    sky96111  
       2023-09-29 18:24:05 +08:00 via Android
    @julyclyde 又查了一下,dnf 是纯 Python 的,但 dnf 底层使用的 libdnf 是 c++。
    看起来我 dnf 卡住的问题和 Python http 请求的问题不是同一个
    pursuer
        28
    pursuer  
       2023-09-30 11:02:42 +08:00
    python 可以使用 faulthandler 排查问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2638 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 09:25 PVG 17:25 LAX 02:25 JFK 05:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86