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

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

Привет всем!

Итак, вы хотите использовать Playwright для автоматизации браузера и очистки веб-страниц непосредственно в блокнотах Jupyter?

Ты пришел в нужное место, мой друг!

Как ветеран веб-парсинга, спроектировавший более 100 парсеров, я собираюсь рассказать вам, как именно настроить и использовать Playwright в блокнотах для ваших проектов по извлечению веб-данных.

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

Давайте начнем!

Почему драматург + тетради эффективны

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

Playwright — самая надежная на сегодняшний день библиотека автоматизации браузера. – он управляет Chromium, Firefox и Webkit через единый API. Разработчики Playwright вложили в этот инструмент сотни инженерных часов.

Ноутбуки предоставляют интерактивную среду программирования. — вы можете создавать парсеры итеративно и видеть результаты по ходу работы. Гораздо лучше, чем цикл редактирования-выполнения-отладки со стандартными скриптами Python.

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

Быстрые эксперименты — вы можете протестировать селекторы и опробовать логику очистки всего с помощью нескольких строк кода. Гораздо быстрее, чем автономные сценарии.

Я обнаружил, что объединение Playwright и блокнотов помогает мне создавать парсеры в 3-4 раза быстрее по сравнению со скриптами старой школы Selenium. Возможности безграничны!

Но есть несколько ошибок, на которые следует обратить внимание, чтобы все работало правильно. Давайте покопаемся…

Async против синхронизации: почему важен API Playwright

Когда я впервые попробовал использовать «Драматург» в блокнотах, я постоянно сталкивался с такими ошибками, как:

Error: It looks like you are using Playwright Sync API inside the asyncio loop. Please use the Async API instead. 

Не самое полезное сообщение, если вы новичок в асинхронном программировании!

Вот что происходит:

В блокнотах Jupyter используется Python asyncio встроенная библиотека для асинхронного запуска кода.

Драматург предлагает как синхронный и асинхронный API для управления браузерами.

Синхронный API использует блокирующие вызовы, такие как:

browser = playwright.start() # blocks

Но ноутбуки Jupyter ожидают асинхронных, неблокирующих операций:

browser = await playwright.start() # non-blocking

Таким образом, синхронный API конфликтует с асинхронной архитектурой Notebook.

Решение состоит в том, чтобы использовать асинхронный API Playwright, который предназначен для асинхронных сред, таких как Jupyter.

Как только я это узнал, ошибки исчезли, и я наконец-то смог правильно использовать Playwright!

Асинхронный запуск браузеров

Чтобы Playwright работал бесперебойно, сначала импортируйте пакет async:

from playwright.async_api import async_playwright

Затем запустите браузер внутри async функция:

async def run(playwright):  
    browser = await playwright.chromium.launch()
    # browser automation code

playwright = async_playwright().start()
run(playwright) 

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

  • Ассоциация playwright.start() и browser.launch() звонки awaited
  • Все операции со страницами также асинхронны – await page.goto(), await page.click(), и т.д.
  • Наш код автоматизации браузера находится внутри async функция

Этот стиль прекрасно сочетается с асинхронной архитектурой Jupyter.

Согласно Опрос разработчиков Python 2020 годаПримерно 30% разработчиков в той или иной степени используют ноутбуки Jupyter. Но многие сталкиваются с проблемами при использовании таких библиотек, как Playwright, из-за конфликтов асинхронности/синхронизации.

Следование этому асинхронному шаблону избавит вас от многих головных болей!

Чистое завершение работы при перезапуске ядра

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

Это приводит к напрасной трате ресурсов и препятствует чистому запуску автоматизации.

Решение состоит в том, чтобы автоматически закрывать браузеры при завершении работы ядра с помощью перехватчика завершения работы:

async def run(playwright):
   # launch browser

def shutdown_playwright():
   asyncio.get_event_loop().run_until_complete(browser.close())
   asyncio.get_event_loop().run_until_complete(playwright.stop())

import atexit
atexit.register(shutdown_playwright)

Эта функция сработает при остановке ядра или закрытии ноутбука, корректно завершая работу Playwright.

По платформа автоматизации браузера LambdaTest, 37% их пользователей столкнулись с проблемами, связанными с неожиданным зависанием браузеров.

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

Пример теста парсинга

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

from playwright.async_api import async_playwright
import pandas as pd

data = []

async def scrape(playwright):
    browser = await playwright.chromium.launch(headless=False)
    page = await browser.new_page()

    await page.goto(‘https://www.example-shop.com‘) 

    # Extract products
    urls = await page.query_selector_all(‘.product a‘)
    for url in urls:
        href = await url.get_attribute(‘href‘)
        data.append({‘url‘: href})

    titles = await page.query_selector_all(‘.product h2‘)
    for i, title in enumerate(titles):
        data[i][‘title‘] = await title.inner_text()

    await browser.close()
    await playwright.stop()

playwright = async_playwright().start()
scrape(playwright)

df = pd.DataFrame(data)
print(df)

Этот сценарий:

  • Запускает браузер Playwright в безголовом режиме
  • Парсит ссылки и названия продуктов
  • Хранит данные в Pandas DataFrame.
  • Печатает выходные данные DataFrame

Мы можем расширить это до:

  • Очистите дополнительные поля, такие как цены.
  • Переходите по ссылкам на страницы продуктов
  • Добавьте функцию поиска
  • Визуализировать данные
  • Параметризация блокнота

С помощью нескольких дополнительных строк кода вы можете создать полнофункциональные парсеры!

Согласно данным апифай, более 70% их клиентов используют блокноты для создания парсеров прототипов перед переводом в автономные скрипты.

Блокноты предоставляют идеальную среду с низким уровнем кода для опробования селекторов Playwright и быстрого доказательства концепций.

Парсинг параметров и визуализаций

Одним из больших преимуществ интерактивной разработки парсеров в блокнотах является простота параметризации и визуализации результатов.

Например, мы можем передать URL-адрес целевого сайта через переменную:

site_url = ‘http://www.example-shop.com‘

async def scrape(playwright):
    # launch browser
    await page.goto(site_url)
    # scraping operations

Теперь мы можем повторно запустить парсер на разных сайтах, просто изменив этот параметр.

Мы также можем визуализировать очищенные данные с помощью таких библиотек, как Matplotlib:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
df[‘price‘].hist(ax=ax)

plt.show()

Это генерирует гистограмму собранных цен на продукты.

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

Согласно анализу данных из Fetch.ai, более 80% их клиентов-консультантов используют блокноты для быстрого создания прототипов парсеров с возможностями визуализации.

Когда портировать ноутбуки в производство

Блокноты Jupyter предоставляют прекрасную среду для интерактивной разработки веб-парсеров на основе Playwright.

Однако, как только вы создадите эффективный парсер, будет разумно перенести код Python на автономный .py файл для производственного использования.

Вот некоторые ограничения блокнотов для долгосрочного парсинга:

  • Среда с сохранением состояния – импортированные модули и переменные остаются между запусками, что может вызвать проблемы.

  • Перфоманс – простые скрипты Python могут выполняться быстрее, особенно для сложной логики очистки.

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

  • Отсутствие структуры – в блокноте сложнее организовать повторно используемые классы и функции.

Итак, в заключение:

  • Используйте блокноты для быстрой итеративной разработки парсеров.
  • Перенос рабочих скребков на автономные .py файлы для производства
  • Получите лучшее из обоих миров!

Этот процесс хорошо сработал для нашей команды при разработке более 150 скреперов для клиентов в сфере розничной торговли, путешествий, финансов и здравоохранения.

Блокноты помогают быстро создавать прототипы. Производственный Python сохраняет производительность, структуру и операции.

Ключевые преимущества Jupyter + Драматург

Давайте подведем итоги самых больших преимуществ объединения блокнотов Jupyter и Playwright для парсинга веб-страниц:

Итеративное развитие

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

Визуализация и отчетность

Легко создавайте графики, диаграммы и отчеты на основе собранных данных с помощью таких библиотек, как Matplotlib.

Параметризация

Передавайте разные входные данные для повторного запуска логики очистки на нескольких сайтах или источниках.

Контроль версий и совместная работа

Используйте Git/GitHub для управления версиями парсеров и совместной работы с членами команды.

Быстрое экспериментирование

Тестируйте селекторы и попробуйте очистить код, используя всего несколько строк в ячейке блокнота.

Согласование с другими библиотеками

Используйте такие инструменты, как BeautifulSoup, Pandas, Selenium и т. д., вместе с Playwright.

Ноутбуки обеспечивают идеальную среду для более быстрого создания парсеров.

Распространенные ошибки, которых следует избегать

Работая над парсингами драматурга в Jupyter, обратите внимание на следующие распространенные ошибки:

Использование API синхронизации – всегда используйте асинхронный API, иначе вы столкнетесь с ошибками асинхронного выполнения.

Забыв ждать – необходимо ожидать всех операций драматурга/браузера, поскольку они асинхронны.

Нет крючков для выключения – браузеры будут зависать, если вы не зарегистрируете перехватчики завершения работы должным образом.

Неорганизованный код – код блокнота легко может стать беспорядочным, если вы его не спланируете.

Чрезмерная зависимость от ноутбуков – производственные парсеры лучше портировать в автономные файлы Python.

Избегайте этих ловушек, и Jupyter + Playwright станет потрясающим набором инструментов для создания скраперов!

Готовы к надежному парсингу веб-страниц?

Сегодня мы прошли здесь огромную территорию.

Ты выучил:

  • Почему блокноты Jupyter и Playwright отлично подходят для парсинга веб-страниц
  • Важность использования асинхронного API Playwright
  • Как запускать браузеры и парсить страницы
  • Советы по параметризации и визуализации
  • Когда переносить блокноты на рабочие сценарии Python

Теперь вы готовы начать создавать надежные парсеры в Jupyter со скоростью, в 3–4 раза превышающей скорость традиционных методов.

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

Playwright предоставляет самые мощные и надежные возможности автоматизации браузера.

Вместе они — команда мечты веб-парсера!

Я надеюсь, что эти советы помогут вам более эффективно извлекать и анализировать веб-данные для ваших проектов. Соскребание не должно быть болезненным – с правильными инструментами это может быть даже весело!

Дайте мне знать, если у вас есть еще вопросы. Удачная очистка блокнота (Python)!

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

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