python requests请求失败重试_Python 频繁请求问题: [Errno 104] Connection reset by peer

记遇到的一个问题:[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次,最后成功地取下了全部图片。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Connection aborted. , ConnectionResetError(104, Connection reset by peer)可能是由两个原因引起的。首先,这可能是因为请求过于频繁,导致请求被服务器拒绝。其次,可能是由于连接超时或访问被拒绝的问题引起的。在这种情况下,通常会出现类似的错误信息,如requests.exceptions.ConnectionError: ('Connection aborted.', error(54, 'Connection reset by peer'))或requests.exceptions.ConnectionError: HTTPSConnectionPool(host='***', port=443): Max retries exceeded with url: *** (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x104491cc0>: Failed to establish a new connection: [Errno 60] Operation timed out',))。为了解决这个问题,你可以尝试两种方法:1.减少请求频率,避免过于频繁地发送请求;2.检查目标网站是否有认证或反爬机制,并识别是否拒绝了Python终端的访问。如果是这种情况,你可以尝试设置一个休眠时间,例如time.sleep(1),来减慢请求的速度,以规避反爬机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python requests请求报错ConnectionError: (‘Connection ...‘, error(104, ‘Connection reset by peer‘))](https://blog.csdn.net/weixin_43925447/article/details/123191482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python访问目标网站报错(‘Connection aborted.‘, error(54, ‘Connection reset by peer‘))解决方案](https://blog.csdn.net/weixin_42669785/article/details/111085396)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值