selenium python -网络驱动程序和异步

83qze16e  于 2023-02-08  发布在  Python
关注(0)|答案(3)|浏览(205)

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

import asyncio
from selenium import webdriver

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

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

f8rj6qna

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。

mwecs4sa

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代码可以处理的并发请求数量可能受到线程池中线程数量的限制,因此您可能需要根据用例的特定要求调整池的大小。

相关问题