2015-09-09 30 views
0

大多數時候,我必須刮掉的網頁數量低於100,因此使用for循環我會在合理的時間內解析它們。但現在我必須解析超過1000個網頁。如何使用線程解析Python中的多個網頁?

尋找一種方法來做到這一點,我發現線程可能會有所幫助。我看過並閱讀了一些教程,我相信我已經理解了一般邏輯。

我知道如果我有100個網頁,我可以創建100個線程。不建議這樣做,特別是對於大量的網頁。我沒有真正想到的是,例如,我如何在每個線程上創建200個網頁的5個線程。

下面是一個使用線程和硒一個簡單的代碼示例:

import threading 
from selenium import webdriver 

def parse_page(page_url): 
    driver = webdriver.PhantomJS() 
    driver.get(url) 
    text = driver.page_source 
    .......... 
    return parsed_items 

def threader(): 
    worker = q.get() 
    parse_page(page_url) 
    q.task_one() 

urls = [.......] 
q = Queue() 

for x in range(len(urls)): 
    t = threading.Thread(target=threader) 
    t.daemon = True 
    t.start() 

for worker in range(20): 
    q.put(worker) 

q.join() 

,我不是明確的另一件事,它是上面的代碼示例所示是我在線程中使用的參數。

+0

要將參數添加到線程,如果您的目標函數有兩個參數:'t = threading.Thread(target = threader,args =(arg1,arg2))' –

回答

0

也許最簡單的方法將使用ThreadPoolmultiprocessing.pool模塊,或者如果你是python3 ThreadPoolExecutorconcurrent.futures模塊。

ThreadPool具有(幾乎)與常規Pool相同的API,但使用線程而不是進程。

例如

def f(i): 
    return i * i 

from multiprocessing.pool import ThreadPool 
pool = ThreadPool(processes=10) 
res = pool.map(f, [2, 3, 4, 5]) 
print(res) 
[4, 9, 16, 25] 

而對於ThreadPoolExecutor檢查這個example