Python - веб-драйвер и Asyncio - PullRequest
0 голосов
/ 12 мая 2018

Можно ли сначала открыть браузер для каждой задачи, а затем загрузить ссылки? Этот код вызывает ошибку

import asyncio
from selenium import webdriver

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

TypeError: объект WebDriver нельзя использовать в выражении 'await'

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Проблема обсуждалась по адресу: https://github.com/SeleniumHQ/selenium/issues/3399

Если вы хотите иметь асинхронные веб-драйверы, вы можете использовать две библиотеки:

0 голосов
/ 26 августа 2018

Если вы хотите использовать Selenium в асинхронном режиме, я бы предложил использовать несколько экземпляров Driver и исполнителя, например так:

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)))

Обратите внимание, что вы можете запускать селен в автономном режиме, поэтомуне нужно создавать весь GUI для вызова некоторого простого URL.

0 голосов
/ 12 мая 2018

Вы можете только await асинхронные сопрограммы.webdriver.Chrome() и driver.get(url) являются обычными функциями.Вы должны определить async функции для этих задач, а затем вы можете await их.

Пример:

async def get_driver():
   return webdriver.Chrome()

async def get_url(driver):
   return driver.get(url)

async def get_html(url):
   driver = await get_driver()
   response = await get_url(driver)

Я не знаю, как работает селен, но я немного знаюАсинсио.Если вы хотите одновременно отправить несколько задач, вы можете определить будущее для каждой из них, а затем использовать asyncio.ensure_future.

...