歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python 頻繁請求問題: [Errno 104] Connection reset by peer

Python 頻繁請求問題: [Errno 104] Connection reset by peer

日期:2017/3/1 9:08:52   编辑:Linux編程

記遇到的一個問題:[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 <class 'socket.error'>: [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次,最後成功地取下了全部圖片。

Copyright © Linux教程網 All Rights Reserved