python - webdriver 和 asyncio

问题描述 投票:0回答:2

是否可以先打开每个任务的浏览器,然后再加载链接? 此代码会引发错误

import asyncio
from selenium import webdriver

async def get_html(url):
    driver = await webdriver.Chrome()
    response = await driver.get(url)

TypeError:对象 WebDriver 不能在“await”表达式中使用

python selenium asynchronous webdriver python-asyncio
2个回答
22
投票

该问题已在以下位置讨论:https://github.com/SeleniumHQ/selenium/issues/3399

如果您想要异步网络驱动程序,可以使用两个库:


20
投票

如果您想以异步方式使用 Selenium,我建议使用驱动程序的多个实例和执行器,如下所示:

import asyncio
from concurrent.futures.thread import ThreadPoolExecutor

from selenium import webdriver

executor = ThreadPoolExecutor(10)


def scrape(url, *, loop):
    loop.run_in_executor(executor, scraper, url)


def scraper(url):
    driver = webdriver.Chrome("./chromedriver")
    driver.get(url)


loop = asyncio.get_event_loop()
for url in ["https://google.de"] * 2:
    scrape(url, loop=loop)

loop.run_until_complete(asyncio.gather(*asyncio.all_tasks(loop)))

请注意,您可以在无头模式下运行 selenium,因此您不需要生成整个 GUI 来调用一些简单的 url。

© www.soinside.com 2019 - 2024. All rights reserved.