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

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

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

import requests

for url in urls:
    try:
        r = requests.get(url).content
        save_image(r)
    except Exception, e:
        print str(e)

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

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)

这让我想起了以前经过hacker news api 在本身电脑上请求一条一条数据时,为了加快处理速度,采用多进程的方式请求接口,也会出现这样的错误。以前我是作了错误记录直接pass了,此次状况下由于须要请求全部图片,在google查了相关缘由,大概是由于我频繁请求,服务器关闭了部门请求链接。参见这里这里这里
因此我粗暴地这么作,还真解决了:git

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

相关文章
相关标签/搜索