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 · 213 天前 · 2230 次点击
    这是一个创建于 213 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的 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  
       213 天前
    from requests.packages.urllib3.exceptions import InsecureRequestWarning
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

    这个?
    jianyang
        2
    jianyang  
    OP
       213 天前
    @forQ 这个是关闭了 ssl 的警告信息,对请求没有改善. 超时,好像还有 SSL 直接报错的情况
    zzl22100048
        3
    zzl22100048  
       213 天前
    具体是访问那个网址? 3.11 默认配置对证书更严格,你可以自定义 sslcontext ,或者不校验证书
    AlanStar
        5
    AlanStar  
       213 天前
    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  
       213 天前 via iPhone
    我也是经常碰到这个 恶心的不行🤢

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

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

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


    奇怪的问题主要是 SSL 偶尔会直接报错,确定设置了 verify=False
    再就是莫名其妙的超时,我也说不清是不是超时,我感觉像,但是 err 信息是空白,正常来讲访问的地址是不可能超时的
    lambdaq
        8
    lambdaq  
       213 天前
    @jianyang connect timeout read timeout 之类的设置小一点,总有一个出错的。
    jianyang
        9
    jianyang  
    OP
       213 天前
    @lambdaq 我一般设置 timeout=(10,10)
    请求的时候有时候感觉也确实等了有 10 秒左右,就 err 了,但是 err 信息是""
    但是请求的地址正常是不可能耗时 10 秒不返回的,正常 1-2S 就返回了
    lambdaq
        10
    lambdaq  
       213 天前
    @jianyang 设置成 (0,5, 10) 和 (10, 1) 看看到底哪个环节出的问题。目测应该是 dns 查挂了。
    jianyang
        11
    jianyang  
    OP
       213 天前
    @lambdaq
    如果是 DNS 挂了那为啥当时我马上用 GO 重写一遍就没一点问题,好几次了都是 python 写完再用 GO 重写一遍。。。
    AlanStar
        12
    AlanStar  
       213 天前
    @jianyang “urllib3 这个库也装了,好像装 requests 的时候就会一起装上”这个确实,但是最好手动装一下确认一下,我云函数那个 case 就是,在本地确认有这个库存在,但是一传到云端就出问题,重新装一下就好了。
    我记得好像 pycharm 是调的 powershell ,好像是默认走代理的吧,Surge 我没用过,具体看 OP 自己的情况了
    jianyang
        13
    jianyang  
    OP
       213 天前
    @AlanStar 嗯嗯、也感谢你的回答
    Outclass
        14
    Outclass  
       212 天前
    我认为就是代理的问题,见知乎文章 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  
       212 天前
    这 9 成是代理问题,下次遇到你可以试试禁用代理的方案,或者先关掉所有网络科技。
    sky96111
        16
    sky96111  
       212 天前 via Android
    有同样的疑惑,出现在 Python 编写的包管理器 dnf 上,切换代理经常导致整个 dnf 程序没有一点输出 hang 住 40 多秒
    sky96111
        17
    sky96111  
       212 天前 via Android
    @sky96111 (注:不是指在程序运行时切换代理,是程序 hang 住这个时间段曾经有切换代理的操作
    maocat
        18
    maocat  
       212 天前
    #15 可能是 pycharm 代理问题,我用 langchain 请求 chatgpt api ,明明没有配置代理,却能通(本机开了代理),可以试试打包到服务器上看看
    julyclyde
        19
    julyclyde  
       212 天前
    @sky96111 hang 住期间切换应该是不会影响环境变量的
    环境变量是“一次性”的
    sky96111
        20
    sky96111  
       212 天前 via Android
    @julyclyde 不是在 dnf 运行时切换代理,是切换代理容易导致出现这个问题
    julyclyde
        21
    julyclyde  
       212 天前
    @sky96111 但是你刚才说的是“是程序 hang 住这个时间段曾经有切换代理的操“啊
    julyclyde
        22
    julyclyde  
       212 天前
    @sky96111 dnf 是 C++的吧? yum 才是 python 的
    sky96111
        23
    sky96111  
       212 天前 via Android
    @julyclyde 还没正式发布的 dnf5 才是 c++,yum 是 dnf 的 alias ,都是 python
    julyclyde
        24
    julyclyde  
       212 天前
    @sky96111 我觉得你可能混淆了 yum3 和 yum4/dnf
    yum3 是 python 的; yum4 是指向 C++的 dnf 的 alias
    stonesirsir
        25
    stonesirsir  
       212 天前 via Android
    有 ipv6 吗?强制 ipv4 ?
    julyclyde
        26
    julyclyde  
       212 天前
    @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  
       211 天前 via Android
    @julyclyde 又查了一下,dnf 是纯 Python 的,但 dnf 底层使用的 libdnf 是 c++。
    看起来我 dnf 卡住的问题和 Python http 请求的问题不是同一个
    pursuer
        28
    pursuer  
       211 天前
    python 可以使用 faulthandler 排查问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5393 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:26 · PVG 16:26 · LAX 01:26 · JFK 04:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.