资讯专栏INFORMATION COLUMN

Python 频繁请求问题: [Errno 104] Connection reset by pee

BearyChat / 3097人阅读

摘要:之前我是做了错误记录直接了,这次情况下因为需要请求所有图片,在查了相关原因,大概是因为我频繁请求,服务器关闭了部门请求连接。在实际的请求中,加了的延迟被拒绝的情况明显少了很多,被拒绝重试的次数最多为次,最后成功地取下了全部图片。

记遇到的一个问题:[Errno 104] Connection reset by peer

今天工作上有个需求,数据库有个表有将近3万条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 : [Errno 104] Connection reset by peer)

这让我想起了之前通过hacker news api 在自己电脑上请求一条一条数据时,为了加快处理速度,采用多进程的方式请求接口,也会出现这样的错误。之前我是做了错误记录直接pass了,这次情况下因为需要请求所有图片,在google查了相关原因,大概是因为我频繁请求,服务器关闭了部门请求连接。参见这里, 这里, 这里。
所以我粗暴地这么做,还真解决了:

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次,最后成功地取下了全部图片。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44274.html

相关文章

  • errno in Linux

    Debug时不时要用到,保存一份方便查看。 [1~34] /usr/include/asm-generic/errno-base.h #ifndef _ASM_GENERIC_ERRNO_BASE_H #define _ASM_GENERIC_ERRNO_BASE_H #define EPERM 1 /* Operation not permitted */...

    livem 评论0 收藏0
  • Linux errno 列表

    摘要:网上关于的资料,要么没有错误名,要么没有错误号,要么格式编排混乱算了,自己记一个吧本文地址操作不允许文件或者目录不存在进程不存在系统调用被中断错误设备或地址不存在参数列表太长执行格式错误文件描述符错误没有子进程请重试内存不足认证被拒绝不可用 网上关于 errno 的资料,要么没有错误名,要么没有错误号,要么格式编排混乱……算了,自己记一个吧 本文地址:https://segmentfa...

    shiguibiao 评论0 收藏0
  • Socket Error 104 bug

    摘要:概述技术栈错误详情报警机器人经常有如下警告过程确定报错位置有日志就很好办首先看日志在哪里打的从三个地方入手我们自己的代码没有的代码从上下来没有的代码在容器中执行 bug概述 技术栈 nginx uwsgi bottle 错误详情 报警机器人经常有如下警告: 1 2018-xx-xxT06:59:03.038Z 660ece0ebaad admin/admin 14 - - Sock...

    keithyau 评论0 收藏0
  • SocketServer 源码分析

    摘要:版权出现则重新调用注册函数。中实例化,调用用户定义的函数服务循环监听端口处理请求调用监视请求,处理异常有请求进来停止循环通知外部,循环已经退出注意的用法,只设置一次,避免使用进行频繁的设置清除。 SocketServer.py Creating network servers. contents SocketServer.py contents file head BaseSer...

    Eric 评论0 收藏0
  • 解决树莓派下载django的TypeError:..... Retry and int 问题

    摘要:没报错但依然无法安装使用再次安装无果感谢大神的分享我才发觉这是一个新手的通用问题树莓派自带的系统附带了一个来自前寒武纪的版本,如果您不想花费数小时来调试与相关的问题,那么就必须升级它。 诸位, 不好意思哈, 请允许我把完整的标题写完(标题不能超过64个有效字符): 记一次解决树莓派下载Django库 ——报错为TypeError: unsupported operand types f...

    miracledan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<