[英]How can I use threading to parse multiple webpages in Python?
在大多數情況下,我必須抓取的網頁數量都在100以下,因此使用for循環可以在合理的時間內解析它們。 但是現在我必須解析1000多個網頁。
在尋找一種實現方法時,我發現線程化可能會有所幫助。 我已經看過並閱讀了一些教程,我相信我已經理解了一般的邏輯。
我知道如果我有100個網頁,則可以創建100個線程。 不建議使用此方法,尤其是對於大量網頁而言。 我還沒有真正弄清楚的是例如如何創建5個線程,每個線程有200個網頁。
以下是使用線程和Selenium的簡單代碼示例:
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()
上面代碼示例中顯示的另一件事我不清楚,那就是我如何在線程中使用參數。
可能最簡單的方法是使用來自multiprocessing.pool模塊的ThreadPool
,或者如果您使用concurrent.futures
模塊的python3 ThreadPoolExecutor 。
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
請檢查此示例 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.