zoukankan      html  css  js  c++  java
  • python requests [Errno 104] Connection reset by peer

    有个需求,数据库有个表有将近 几千条 url 记录,每条记录都是一个图片,我需要请求他们拿到每个图片存到本地。一开始我是这么写的(伪代码):

    import requests

    for url in urls:

        try:

            r = requests.get(url).content

            save_image(r)

        except Exception, e:

            print str(e)

    然而在服务器上运行时, 会发现每隔一些请求会报类似下面的错误:

    HTTPConnectionPool(host='wx.qlogo.cn', port=80): 
    Max retries exceeded with url: /mmopen/aTVWntpJLCAr2pichIUx8XMevb3SEbktTuLkxJLHWVTwGfkprKZ7rkEYDrKRr5icyDGIvU4iasoyRrqsffbe3UUQXT5EfMEbYKg/0 (
    Caused by <class 'socket.error'>: [Errno 104] Connection reset by peer)

    原因,大概是因为我频繁请求,服务器关闭了部门请求连接

    import requests

    for url in urls:

        for i in range(10):

            try:

                r = requests.get(url).content

            except Exception, e:

                if i >= 9:

                    do_some_log()

                else:

                    time.sleep(0.5)

             else:

                time.sleep(0.1)

                break

        save_image(r)

    代码很简陋,但可以说明大体解决方案,在每个请求间增加延时可以减少大部分请求拒绝,

    但还是存在一些请求被拒绝的,所以在那部分请求被拒绝后,发起重试,

    在被拒 10 次后才善罢甘休(记录到日志)。

    在实际的请求中,加了 0.1s 的延迟被拒绝的情况明显少了很多,

    被拒绝重试的次数最多为 3 次,最后成功地取下了全部图片。

  • 相关阅读:
    【洛谷 1144】最短路计数
    【洛谷 1608】路径统计
    【洛谷 1491】集合位置
    【洛谷 3110】驮运 Piggy Back
    【洛谷 1734】最大约束和
    【洛谷 1910】L国的战斗之间谍
    【洛谷 1048】采药
    【洛谷 1186】玛丽卡
    GeoServer(地图服务器)
    git cherry-pick 教程
  • 原文地址:https://www.cnblogs.com/yuzhaoblog/p/11676327.html
Copyright © 2011-2022 走看看