urllib2.urlopenタイムアウト問題解決策

3479 ワード

timeoutパラメータが設定されていないため、結果的にネットワーク環境が悪い場合、read()メソッドに何の反応もないという問題がしばしば発生し、プログラムカードはread()メソッドで死んで、長い間問題を見つけ、urlopenにtimeoutを加えるとokになり、timeoutを設定した後にタイムアウトした後にreadがタイムアウトしたときにsocketを投げ出す.timeout異常、プログラムを安定させるにはurlopenに異常処理を加え、異常再試行を加える必要があり、プログラムは完璧です.
import urllib2  

url='http://www.facebook.com/'  
fails = 0  
while True:  
    try:  
        if fails >= 20:  
            break  
        req = urllib2.Request(url)  
        response = urllib2.urlopen(req, None, 3)  
        page = response.read()  
    except:  
        fails += 1  
        print '        ,         : ', fails  
    else:  
        break  

ソリューション:
ネットワークデータを取得する際に、相手のネットワーク速度が遅い、サーバがタイムアウトするなどの理由でurllib 2を招くことがあります.urlopen()以降のread()操作(ダウンロードコンテンツ)カードが死んだ場合、この問題を解決する方法は以下の通りです.
1、urlopenのオプションパラメータtimeoutを設定する
import urllib2
# http://classweb.loxa.com.tw/dino123/air/P1000772.jpg
r = urllib2.Request("http://classweb.loxa.com.tw/dino123/air/P1000775.jpg")
try:
        print 111111111111111111
        f = urllib2.urlopen(r, data=None, timeout=3)
        print 2222222222222222
        result =  f.read()
        print 333333333333333333
except Exception,e:
        print "444444444444444444---------" + str(e)

print "55555555555555"

2、グローバルのsocketタイムアウトを設定する:
import socket
socket.setdefaulttimeout(10.0) 
    :httplib2 or timeout_urllib2
http://code.google.com/p/httplib2/wiki/Examples
http://code.google.com/p/timeout-urllib2/source/browse/trunk/timeout_urllib2.py

3、タイマーtimerを使う
from urllib2 import urlopen
from threading import Timer
url = "http://www.python.org"
def handler(fh):
        fh.close()
fh = urlopen(url)
t = Timer(20.0, handler,[fh])
t.start()
data = fh.read()    #                   
t.cancel()