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

2024-06-25 06:09:38 发布

您现在位置: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()

另一件我不清楚的事情是如何在线程中使用参数。在


Tags: importurl网页forgetparsedefdriver
1条回答
网友
1楼 · 发布于 2024-06-25 06:09:38

可能最简单的方法是使用ThreadPool来自multiprocessing.pool模块,或者如果您使用的是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,请检查example。在

相关问题 更多 >