【问题标题】:Python multithreading crawler for unknown size未知大小的Python多线程爬虫
【发布时间】:2021-07-29 04:16:49
【问题描述】:

我有一个要使用 selenium 抓取的页面列表

假设网站是 example.com/1...N(最大未知大小)

from concurrent.futures import ThreadPoolExecutor, as_completed
from webdriver_manager.chrome import ChromeDriverManager

def crawl_example(page):
  driver = webdriver.Chrome(ChromeDriverManager().install())
  driver.get(f"example.com/{page}")
  # Do some processing
  result = "Fetched data"
  return result


N_THREAD = 10
MAX_SIZE = 100

with ThreadPoolExecutor(N_THREAD) as ex:
  futures = [ex.submit(crawl_example, page) for page in range(MAX_SIZE)]

设置 MAX_SIZE 在 N 之后调用不必要的请求,所以我想找到一个更好的解决方案。 我只能考虑创建一个全局变量(is_done)或向函数添加另一个参数。

解决上述问题最pythonic的方法是什么?

【问题讨论】:

  • 您要调整MAX_SIZE 运行时间吗?就像你从函数 crawl_example 得到 404 然后你调整 max_size 或退出执行程序?有没有办法在启动 executor 之前找到 N?
  • 是的,我想在运行时调整 MAX_SIZE。除非我对 MAX_SIZE 进行一些二分搜索,否则在爬行之前我找不到 N。

标签: python multithreading selenium web-scraping web-crawler


【解决方案1】:

last_page 变量初始化为无穷大(最好在类变量中)

并且使用以下逻辑进行更新和抓取就足够了

由于两个线程可以同时更新last_page

防止更高的page覆盖last_page被更低的page更新

from threading import Lock
last_page_lock = Lock()

def crawl_page(page):
  if page > last_page:
    continue
  if page_empty():
    with last_page_lock():
      last_page = min(last_page, page)
  ... 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多