亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Python 頻繁請(qǐng)求問(wèn)題

原創(chuàng) 2016-11-15 13:35:40 507
摘要:記遇到的一個(gè)問(wèn)題:[Errno 104] Connection reset by peer今天工作上有個(gè)需求,數(shù)據(jù)庫(kù)有個(gè)表有將近3萬(wàn)條url記錄,每條記錄都是一個(gè)圖片,我需要請(qǐng)求他們拿到每個(gè)圖片存到本地。一開(kāi)始我是這么寫(xiě)的(偽代碼):import requests for url in urls:     try:

記遇到的一個(gè)問(wèn)題:[Errno 104] Connection reset by peer

今天工作上有個(gè)需求,數(shù)據(jù)庫(kù)有個(gè)表有將近3萬(wàn)條url記錄,每條記錄都是一個(gè)圖片,我需要請(qǐng)求他們拿到每個(gè)圖片存到本地。一開(kāi)始我是這么寫(xiě)的(偽代碼):

import requests

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

然而在服務(wù)器上運(yùn)行時(shí), 會(huì)發(fā)現(xiàn)每隔一些請(qǐng)求會(huì)報(bào)類似下面的錯(cuò)誤:

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)

這讓我想起了之前通過(guò)hacker news api 在自己電腦上請(qǐng)求一條一條數(shù)據(jù)時(shí),為了加快處理速度,采用多進(jìn)程的方式請(qǐng)求接口,也會(huì)出現(xiàn)這樣的錯(cuò)誤。之前我是做了錯(cuò)誤記錄直接pass了,這次情況下因?yàn)樾枰?qǐng)求所有圖片,在google查了相關(guān)原因,大概是因?yàn)槲翌l繁請(qǐng)求,服務(wù)器關(guān)閉了部門(mén)請(qǐng)求連接。參見(jiàn)這里, 這里, 這里。
所以我粗暴地這么做,還真解決了:

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)

代碼很簡(jiǎn)陋,但可以說(shuō)明大體解決方案,在每個(gè)請(qǐng)求間增加延時(shí)可以減少大部分請(qǐng)求拒絕,但還是存在一些請(qǐng)求被拒絕的,所以在那部分請(qǐng)求被拒絕后,發(fā)起重試,在被拒10次后才善罷甘休(記錄到日志)。在實(shí)際的請(qǐng)求中,加了0.1s的延遲被拒絕的情況明顯少了很多,被拒絕重試的次數(shù)最多為3次,最后成功地取下了全部圖片。

發(fā)布手記

熱門(mén)詞條