如何使用线程来解析Python中的多个网页?

时间:2015-09-09 17:48:42

标签: python multithreading selenium

大多数时候我必须抓取的网页数量都低于100,因此使用for循环我会在合理的时间内解析它们。但现在我必须解析超过1000个网页。

正在寻找一种方法,我发现线程可能有所帮助。我已经观看并阅读了一些教程,我相信我已经理解了一般逻辑。

我知道如果我有100个网页,我可以创建100个线程。不建议这样做,特别是对于大量的网页。我还没想到的是,例如,我如何在每个线程上创建包含200个网页的5个线程。

下面是一个使用线程和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()

我不清楚的另一件事是上面的代码示例中显示的是我如何在线程中使用参数。

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是使用multiprocessing.pool模块中的ThreadPool,或者来自concurrent.futures模块的python3 ThreadPoolExecutor

ThreadPool(几乎)与常规Pool具有相同的api,但使用线程而不是进程。

e.g。

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