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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM