2013-07-05 61 views
2

我有一組50個url ...並且從每個url中,我使用urllib2檢索一些數據。我下面(包括每個URL設置Cookie),該流程進行如下:替換爲urllib2

urls = ['https://someurl', 'https://someurl', ...] 
vals = [] 

for url in urls: 
    req2 = urllib2.Request(url) 
    req2.add_header('cookie', cookie) 
    response = urllib2.urlopen(req2) 
    data = response.read() 
    vals.append(json.loads(data)) 

所以,基本上我從所有這些URL中檢索數據並在丘壑列表爲之傾倒。整個過程需要大約15.5到20秒。我需要知道是否有任何其他的python庫,我可以通過它執行相同的操作,但速度更快。或者如果你們可以使用urllib2提出任何其他更快的方法來處理這個問題,那麼它會沒事的以及。謝謝。

+0

你應該嘗試使用'requests'。這使得很多這些事情更容易管理。 (請注意,它不會解決*性能*問題,只需要更好的代碼。) –

+0

Chris,你可以用任何單個示例來詳細說明嗎? – user2480542

回答

2

urllib2的速度在這裏不會成爲限制因素,大多數時候它會等待TCP連接或者遠程服務器響應。

使用Python的multiprocessing模塊相當簡單,但您也可以使用線程模塊。

multiprocessing.Pool可以使用這樣的:

from multiprocessing import Pool 
# Use the following if you prefer to use threads over processes. 
# from multiprocessing.pool import ThreadPool as Pool 

urls = ['https://someurl', 'https://someurl', ...] 

def download_json(url): 
    req2 = urllib2.Request(url) 
    req2.add_header('cookie', cookie) 
    response = urllib2.urlopen(req2) 
    data = response.read() 
    return json.loads(data) 

pool = Pool() 
vals = pool.map(download_json, urls) 
+0

這工作相當不錯..但不是很大的區別..但不勝感激:-)謝謝。 – user2480542

1

urllib2非常快(50個網站20秒不是這麼慢)。連接資源需要一些時間。您要做的是multithreading

+0

嗯..我讀了一個Queue類和多處理模塊的例子..只是想知道如何實現? – user2480542

3

所以,如果15-20秒是昂貴的有兩件事你可以嘗試:

  1. 使用線程用的urllib2本身。例如爲here
  2. 你可以嘗試pycurl。(不知道性能改進)
  3. 一旦我使用subprocess.Popen運行curl命令,並從URL JSON格式的響應。我使用它來並行地調用不同的URL並使用Popen對象的通信方法在響應到達時進行響應。
+0

非常感謝。您提到的每一點,先生,都是有效的。 – user2480542