перейти к содержанию

Как запустить Playwright в блокнотах Jupyter: полное руководство

Вы веб-разработчик или специалист по данным и хотите автоматизировать просмотр и очистку веб-сайтов с помощью блокнотов Jupyter? Playwright — мощный инструмент для веб-автоматизации, но запуск его синхронного API по умолчанию в асинхронной среде Jupyter создает некоторые проблемы. Но не волнуйтесь: внеся несколько изменений, мы сможем обеспечить бесперебойную работу Playwright в Jupyter и раскрыть весь его потенциал.

В этом подробном руководстве я расскажу вам обо всем, что вам нужно знать, чтобы профессионально запускать Playwright в блокнотах Jupyter. Мы рассмотрим установку, интеграцию с циклом событий asyncio Jupyter, преобразование сценариев Playwright в асинхронные, советы по отладке, лучшие практики и многое другое. К концу вы будете готовы создавать надежные и эффективные блокноты веб-автоматизации с помощью Playwright. Давайте погрузимся!

Что такое Драматург?

Playwright — это библиотека с открытым исходным кодом для автоматизации веб-браузеров, разработанная Microsoft. Он позволяет программно взаимодействовать с веб-страницами в браузерах Chromium, Firefox и WebKit. С помощью Playwright вы можете автоматизировать такие задачи, как сбор данных, тестирование веб-приложений, создание PDF-файлов и многое другое, и все это с помощью единого API.

Некоторые ключевые преимущества драматурга включают в себя:

  • Кроссбраузерная поддержка
  • Быстрое и надежное исполнение
  • Надежные механизмы автоматического ожидания и тайм-аута
  • Мощные параметры выбора, такие как CSS, XPath и текст.
  • Автоматические страницы, домены и разрешения
  • Возможность эмуляции мобильных устройств и геолокации
  • Простая настройка и отсутствие внешних зависимостей

Playwright быстро завоевал популярность благодаря простоте использования и богатому набору функций. Это отличный выбор как для новичков, так и для опытных разработчиков, желающих автоматизировать взаимодействие с Интернетом.

Задача с бегущим драматургом в Jupyter

Хотя Playwright легко использовать в автономных сценариях Python, его запуск в блокнотах Jupyter представляет собой проблему. По умолчанию Playwright использует синхронный API, то есть блокирует выполнение до завершения каждой команды. Однако блокноты Jupyter работают в цикле событий asyncio для одновременного управления несколькими задачами.

Если мы используем синхронный API Playwright в блокноте Jupyter, мы столкнемся с такими ошибками, как:

RuntimeError: Timeout context manager should be used inside a task

Это происходит потому, что синхронный API блокирует цикл событий, не позволяя Jupyter запускать другие задачи. Чтобы исправить это, нам нужно вместо этого использовать асинхронный API Playwright, который правильно интегрируется с циклом событий.

Установка драматурга в Jupyter

Прежде чем мы начнем программировать, давайте установим необходимые пакеты в нашу среду Jupyter. Откройте новый блокнот и запустите:

!pip install playwright
!pip install nest_asyncio

При этом будут установлены библиотека Playwright и neg_asyncio, которые мы будем использовать позже для интеграции с циклом событий.

Включение Async API Playwright

Чтобы использовать async API, нам сначала нужно импортировать его вместе с asyncio:

import asyncio 
from playwright.async_api import async_playwright

Мы также включим интеграцию цикла событий asyncio с помощьюnest_asyncio:

import nest_asyncio
nest_asyncio.apply()

Это позволяет нам без проблем использовать синтаксис async/await в блокноте.

Запуск браузера с Async API

Теперь посмотрим, как запустить браузер с асинхронным API:

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        await page.goto("https://example.com")
        await page.screenshot(path="example.png")
        await browser.close()

await main()

Давайте разберем это:

  1. Мы определяем асинхронную функцию под названием main() чтобы сохранить наш код драматурга.

  2. внутри main(), мы используем async with для создания async_playwright контекстный менеджер. Это обеспечивает автоматический запуск и закрытие браузера для нас.

  3. Запускаем браузер Chromium с p.chromium.launch(), проходя headless=False чтобы мы могли видеть окно браузера.

  4. Создаем новую страницу с browser.new_page() и перейдите к URL-адресу с помощью page.goto().

  5. Делаем скриншот страницы с помощью page.screenshot().

  6. Наконец, мы закрываем браузер с помощью browser.close() (это обрабатывается контекстным менеджером при использовании async with).

После определения main(), мы ожидаем запуска нашего асинхронного кода.

Ключевые отличия от синхронного API:

  • . async def определить асинхронную функцию
  • Ожидание всех команд Драматурга с await
  • . async with управлять жизненным циклом браузера

Структурируя наш код таким образом, он будет плавно работать в блокноте Jupyter, не блокируя цикл событий.

Расположение элементов на странице

Playwright предоставляет несколько методов поиска элементов на странице, например:

  • page.query_selector(): найти элемент с помощью селектора CSS.
  • page.query_selector_all(): найти все элементы, соответствующие селектору CSS.
  • page.xpath(): найти элемент по XPath
  • page.text_content(): получить текстовое содержимое элемента.

Например, чтобы найти и нажать кнопку:

button = await page.query_selector("button")
await button.click()

Или чтобы извлечь текст из заголовка:

heading = await page.query_selector("h1")
text = await heading.text_content()
print(text)

При поиске элементов Playwright автоматически ожидает их прикрепления к странице, поэтому в большинстве случаев явное ожидание не требуется. Это делает обработку элементов очень лаконичной.

Советы по отладке

Отладка асинхронного кода в блокнотах может оказаться сложной задачей. Вот несколько советов:

  • Используйте волшебную команду Jupyter %%debug открыть интерактивный отладчик, если в асинхронной функции возникает исключение.

  • Поставьте headless=False при запуске браузера, чтобы увидеть, что происходит.

  • Используйте print() операторы свободно проверять значения переменных.

  • Обратитесь к журналам отладки Playwright, установив PWDEBUG переменная окружения:

PWDEBUG=1 jupyter notebook

Это выведет подробные журналы на терминал, на котором вы запустили Jupyter.

Лучшие практики

Вот несколько рекомендаций, которые следует учитывать при использовании Playwright в Jupyter:

  • Используйте контекстные менеджеры (async with) для автоматического управления браузером и страницами. Это гарантирует правильное закрытие ресурсов.

  • Сохраняйте свой код модульным, определяя повторно используемые функции для общих задач.

  • По возможности используйте относительные URL-адреса, чтобы сделать ваш код более переносимым.

  • Избегайте жестко запрограммированных задержек с помощью time.sleep(). Вместо этого используйте встроенные механизмы ожидания Playwright.

  • Сохраняйте пользовательские данные, такие как файлы cookie и локальное хранилище, между сеансами, если это необходимо для вашего варианта использования.

  • Закройте браузеры и страницы по завершении, чтобы освободить ресурсы.

Продвинутые темы

Мы рассмотрели основы работы с Playwright в Jupyter, но вы можете сделать гораздо больше! Некоторые дополнительные темы для изучения:

  • Обработка нескольких страниц и контекстов браузера
  • Взаимодействие с iframe и теневыми элементами DOM.
  • Заполнение и отправка форм
  • Захват и проверка сетевого трафика
  • Эмуляция мобильных устройств
  • Создание PDF-файлов страниц
  • Использование прокси для парсинга веб-страниц
  • Интеграция с другими библиотеками, такими как Pandas, для анализа данных.

Предлагаю вам проконсультироваться Документация драматурга чтобы узнать обо всех возможностях.

Собираем все вместе

Вот полный пример, демонстрирующий несколько концепций драматурга в блокноте Jupyter:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()

        # Navigate to a URL
        await page.goto("https://scrapingbee.com/blog/")

        # Find the first h2 element and print its text
        h2 = await page.query_selector("h2")
        text = await h2.text_content()
        print(f"First h2 text: {text}")

        # Find the search input and enter a query
        search_input = await page.query_selector(‘input[type="search"]‘)
        await search_input.fill("python")
        await search_input.press("Enter")
        await page.wait_for_url("**/search/**")

        # Take a screenshot of the search results
        await page.screenshot(path="search_results.png")

        await browser.close()

await main()

Этот скрипт переходит в блог, извлекает текст из заголовка, вводит поисковый запрос и делает снимок экрана с результатами поиска. Смело адаптируйте его для своих целей!

Заключение

В этом руководстве мы узнали, как эффективно запускать Playwright в блокнотах Jupyter с использованием асинхронного API. Мы рассмотрели установку, интеграцию цикла событий, запуск браузера, поиск элементов, отладку, лучшие практики и многое другое.

Обладая этими знаниями, вы готовы создавать мощные и эффективные блокноты для веб-автоматизации. Возможности безграничны — от сбора данных для анализа до автоматизации сложных пользовательских потоков.

Помните, это только начало. Продолжайте изучать возможности Playwright и интегрировать их с другими инструментами, чтобы создавать еще более впечатляющие проекты. Не бойтесь экспериментировать и сверяйтесь с документацией, если застряли.

Приятного программирования, и пусть ваши блокноты «Драматург» работают без сбоев!

Дальнейшее чтение

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *