2010-11-26 27 views
1

我使用的urllib2開放下載一些網頁。不幸的是一個頁面是一個無限流(一組實況視頻幀)和的urllib2不會超時,因爲開放調用成功,而「讀」電話掛斷,直到永遠。示例代碼:如何使用urllib2打開'無限'jpg?

res = opener.open(encoded, timeout=timeout) 
log('opened', url) 
contents = res.read() 
log('never get here') 

避免/消除這些連接的任何提示?

+0

當你發現你喜歡的答案,請接受它^^ – 2010-11-26 15:06:57

回答

3

使用雅各布提到的發電機的方法,我一體的「殺死開關」。

startime = datetime.now() 
res = opener.open(url, timeout=timeout) 
contents = '' 
for item in res: 
    contents += item 
    if (datetime.now() - starttime).seconds > timeout: 
    raise IOError('timeout') 
2

您應該檢查標題以檢測它是否爲多部分,然後刪除或讀取內容。

0

您可以將超時的操作作爲一個整體,即,你提到的那些行定義的功能。

3

這聽起來像發電機工作!

想象一下,你有一個無限的文本文件...現在叫它test.txt open('test.txt').read()將掛起機器並最終崩潰,所以爲什麼不在生成器的這個無限流中產生線路。

def yield_line(file): 
    with open(file) as inp: 
     for line in inp: 
      yield line 

現在當初始化yield_line成爲一個可迭代對象,因此這將成爲法律

out = open('out.txt') 
for line in yield_line('test.txt'): 
    out.write(line.replace('1','2')) 

現在考慮一個URL可以以同樣的方式作爲一個文件進行操作,你可以得到線的線網址

def yield_url(url): 
    with urllib.urlopen(url) as inp: 
     for line in inp: 
      yield line 

編輯: 超時例如

out = open('out.txt') 
for count, line in enumerate(yield_line('test.txt')): 
    if count == 444: #timeout value :D 
     break 
    out.write(line.replace('1','2')) 
+0

這是有幫助的,但我的觀點是,我不希望下載一個無限的文件,我想殺死此類下載。但是,我使用您的發電機策略來解決問題。 – muckabout 2010-11-26 11:18:18

相關問題