Привет всем!
Итак, вы хотите использовать 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)!