是否可以先为每个任务打开浏览器,然后再加载链接?此代码引发错误
import asyncio from selenium import webdriver async def get_html(url): driver = await webdriver.Chrome() response = await driver.get(url)
TypeError:不能在“await”表达式中使用对象WebDriver
oknwwptz1#
讨论该问题的地点:https://github.com/SeleniumHQ/selenium/issues/3399如果您希望使用异步webdrivers,可以使用以下两个库:
f8rj6qna2#
如果你想以异步方式使用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)))
请注意,您可以在headless模式下运行selenium,因此您不需要为了调用某个简单的url而生成整个GUI。
mwecs4sa3#
例如:为了使用Selenium制作一个FastAPI应用程序而不延迟API,您可以在一个单独的线程或进程中运行Selenium代码,并使用asyncio与之通信。
from fastapi import FastAPI from selenium import webdriver import asyncio import concurrent.futures app = FastAPI() async def fetch_page(url): with concurrent.futures.ThreadPoolExecutor() as executor: future = executor.submit(load_page, url) return await asyncio.wrap_future(future) def load_page(url): driver = webdriver.Firefox() driver.get(url) page_source = driver.page_source driver.quit() return page_source @app.get("/") async def root(url: str): page_source = await fetch_page(url) return {"page_source": page_source}
在本例中,load_page函数使用concurrent.futures.ThreadPoolExecutor类在单独的线程中运行Selenium代码。fetch_page函数使用asyncio.wrap_future将load_page的结果 Package 为异步对象,可以在根函数中等待。这种方法允许FastAPI在Selenium代码在后台运行的同时继续服务其他请求,确保API保持响应性并且不会延迟。但是,请记住,Selenium代码可以处理的并发请求数量可能受到线程池中线程数量的限制,因此您可能需要根据用例的特定要求调整池的大小。
3条答案
按热度按时间oknwwptz1#
讨论该问题的地点:https://github.com/SeleniumHQ/selenium/issues/3399
如果您希望使用异步webdrivers,可以使用以下两个库:
f8rj6qna2#
如果你想以异步方式使用Selenium,我建议你使用多个驱动程序示例和一个执行器,如下所示:
请注意,您可以在headless模式下运行selenium,因此您不需要为了调用某个简单的url而生成整个GUI。
mwecs4sa3#
例如:为了使用Selenium制作一个FastAPI应用程序而不延迟API,您可以在一个单独的线程或进程中运行Selenium代码,并使用asyncio与之通信。
在本例中,load_page函数使用concurrent.futures.ThreadPoolExecutor类在单独的线程中运行Selenium代码。fetch_page函数使用asyncio.wrap_future将load_page的结果 Package 为异步对象,可以在根函数中等待。
这种方法允许FastAPI在Selenium代码在后台运行的同时继续服务其他请求,确保API保持响应性并且不会延迟。但是,请记住,Selenium代码可以处理的并发请求数量可能受到线程池中线程数量的限制,因此您可能需要根据用例的特定要求调整池的大小。