2011-02-25 60 views
4

編輯:多擺弄之後,似乎urlgrabber成功,其中urllib2的失敗,甚至告訴它關閉每個文件後,在連接時。似乎urllib2處理代理的方式可能有問題,或者我使用它的方式有問題! 不管怎麼說,這裏可能是最簡單的代碼在一個循環來檢索文件:urlib2.urlopen通過代理後,打了幾個電話失敗

import urlgrabber 

for i in range(1, 100): 
    url = "http://www.iana.org/domains/example/" 
    urlgrabber.urlgrab(url, proxies={'http':'http://<user>:<password>@<proxy url>:<proxy port>'}, keepalive=1, close_connection=1, throttle=0) 

大家好!

我想寫一個非常簡單的python腳本通過urllib2抓取一堆文件。

這個腳本需要通過代理工作(如果在內部網上抓取文件,即沒有代理,我的問題就不存在)。

上述腳本在多次請求後出現「HTTPError:HTTP錯誤401:基本身份驗證失敗」失敗。任何想法爲什麼這可能是?它似乎代理拒絕我的身份驗證,但爲什麼?第一對urlopen請求正確無誤!

編輯:在請求之間添加10秒的睡眠以避免可能由代理完成的某種限制不會改變結果。

這裏是我的腳本的簡化版本(與剝離標識的信息,很明顯):提前

import urllib2 

passmgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passmgr.add_password(None, '<proxy url>:<proxy port>', '<my user name>', '<my password>') 
authinfo = urllib2.ProxyBasicAuthHandler(passmgr) 

proxy_support = urllib2.ProxyHandler({"http" : "<proxy http address>"}) 
opener = urllib2.build_opener(authinfo, proxy_support) 
urllib2.install_opener(opener) 

for i in range(100): 
with open("e:/tmp/images/tst{}.htm".format(i), "w") as outfile: 
    f = urllib2.urlopen("http://www.iana.org/domains/example/") 
    outfile.write(f.read()) 

謝謝!

回答

1

您可以通過使用urlgrabber模塊中的存活處理程序來最小化連接數。

import urllib2 
from keepalive import HTTPHandler 
keepalive_handler = HTTPHandler() 
opener = urllib2.build_opener(keepalive_handler) 
urllib2.install_opener(opener) 

fo = urllib2.urlopen('http://www.python.org') 

我不確定這是否可以正確使用您的代理設置。 您可能需要破解Keepalive模塊。

+0

看起來keepalive模塊從urlgrabber中消失了(請參閱這裏的jwat's anwer:http://stackoverflow.com/questions/1037406/python-urllib2-with-keep-alive)。但是,urlgrabber.urlgrab支持代理併成功檢索到所有文件。我已將相關代碼添加到問題中。 – 2011-03-04 09:25:08

1

該代理可能會限制您的請求。我想它認爲你看起來像一個機器人。

你可以添加一個超時值,看看是否讓你完成。

+0

感謝您的建議!儘管如此,即使在請求之間有10秒的睡眠時間,仍然沒有快樂......這真是奇怪! – 2011-02-28 07:56:05