Начало работы с парсингом веб-страниц: отзывы Amazon с помощью BeautifulSoup
Что такое парсинг веб-страниц?
Просто говоря, парсинг веб-страниц означает автоматическое извлечение данных с веб-сайтов, и для этого существуют разные способы: можно использовать API (если он доступен) или парсить данные с помощью библиотек Python, таких как BeautifulSoup. Существуют и другие библиотеки, такие как Scrapy и Selenium. Scrapy довольно надежен и может использоваться для более крупных проектов по парсингу, а Selenium - это инструмент для тестирования веб-приложений, который также может использоваться для извлечения данных.
BeautifulSoup - это библиотека Python для извлечения данных из файлов HTML и XML. Ее можно установить с помощью команды pip install bs4. Мне нравится использовать BeautifulSoup, потому что она довольно проста и удобна в использовании. Мне показалось интересным спарсить отзывы Amazon, и так как я искал новое кошачье дерево для своей кошки Беллини, я подумал, что нет лучшего введения в парсинг веб-страниц.
Вот быстрый взгляд на кошачье дерево на Amazon:
В этом посте я расскажу о том, как спарсить несколько отзывов на Amazon с помощью Python. Но, начнем с одного отзыва, чтобы начать...
Получение данных с использованием BeautifulSoup
Для понимания BeautifulSoup и HTML-тегов полезно сначала проверить страницу Amazon, которую мы хотим спарсить:
Когда вы щелкаете правой кнопкой мыши на отзыве, появляется небольшое меню, где вы можете получить доступ к исходному коду страницы, нажав на "Просмотреть код элемента". Вы также можете получить доступ к HTML-тексту, перейдя в меню "Вид -> Разработчик -> Инструменты разработчика". После нажатия на "Просмотреть код элемента" вы увидите структуру HTML, которую можно представить как разбивку веб-страницы справа. Чем больше вы изучаете и знакомитесь с веб-страницей, тем проще будет ее спарсить!
Одна из функций, которую я люблю, заключается в том, что если вы наведете курсор на HTML-текст справа, вы увидите соответствующие элементы, выделенные на левой стороне (веб-страница).
Вот пример, где мы видим заголовок продукта "MAU Modern Cat Tree Tower, Natural Branch Cat Condo" с использованием тега h1. Он подсвечивается, когда я навожу курсор на класс h1 справа:
Веселая часть - Python и BeautifulSoup
Чтобы начать использовать Python, мне нужно импортировать мои инструкции и заголовки, которые я буду передавать при чтении веб-страницы:
Использование urllib и urlopen поможет нам легко открыть нужный URL. Я создал вспомогательную функцию для получения веб-данных и преобразования их в HTML-код с использованием bs4. Это указывает, что мы хотим использовать парсер HTML:
Используя мою вспомогательную функцию, я могу получить доступ к содержимому страницы в виде HTML-кода и сохранить его как soup:
Использование заголовков продукта
Как только у меня есть содержимое веб-сайта в HTML-коде, я хочу начать с простого извлечения заголовка продукта.
Поскольку он был помечен как заголовок h1, мы находим первый тег h1, выполнив следующее:
Обратите внимание, что это возвращает один элемент BeautifulSoup, который имеет атрибуты id и class:
Мы можем извлечь фактический текст заголовка, используя функцию .get_text() - и при этом немного очистить данные:
BeautifulSoup также позволяет нам получить все элементы с тегами h1, используя функцию .find_all():
Если мы проверим тип all_headers, мы увидим, что это ResultSet:
Чтобы извлечь текст из каждого элемента в ResultSet, нам нужно перебрать каждый из них. Вот пример того, как пройтись по каждому элементу и вывести его соответствующий текст:
И вуаля! Теперь у нас есть заголовок продукта! Далее мы будем парсить отзывы о продукте для MAU Modern Cat Tree Tower.
Обзоры продуктов
Чтобы извлечь обзоры продуктов, мне нужно вернуться на веб-страницу и проанализировать HTML-текст, чтобы увидеть, как он настроен, и найти соответствующие теги и атрибуты.
Когда я навожу курсор на HTML-текст, я вижу <div>
с атрибутом id
"cm_cr-review-list" и классом "a-section a-spacing-none review-views celwidget", что дает мне подсказку, что мой список обзоров находится здесь. Слева мы видим, что он выделен, так как это соответствующий элемент на веб-странице.
Прокрутите немного вниз, и вы увидите, что каждый обзор имеет уникальный атрибут id
и data-hook
с именем "review". Есть дополнительная информация, но пока этого достаточно.
Используя тег div
и атрибут data-hook
, я могу извлечь информацию об обзоре. Опять же, я могу использовать функцию .find_all()
, которая вернет итерируемый объект, содержащий весь HTML для каждого обзора, обернутого в элемент <div>
с атрибутом data-hook
"review":
Рассмотрим наш первый обзор, мы можем узнать некоторые из тех же тегов и атрибутов, которые мы видели на веб-странице. Я выделил id
, который мы видели на веб-странице. Это сырой HTML-код, поэтому он выглядит немного беспорядочно:
Но если мы посмотрим на теги span
для первого обзора, они выглядят более аккуратно и организованно.
Мы видим имя профиля "Flower Momma", которое соответствует тому, что мы видим на Amazon!
Используя .get_text()
, мы можем получить текст в нашем первом обзоре для всех элементов с тегом <span>
:
Если мы хотим получить другую информацию из обзора, мы будем искать соответствующий тег. Например, чтобы получить имя профиля, мы используем <span>
и ищем элементы с атрибутом class
, названным "a-profile-name":
Если мы хотим получить количество звезд из обзора, мы будем использовать следующее:
И, чтобы извлечь содержимое обзора из этого первого обзора, мы все еще используем <span>
с атрибутом class
"review-text" и .get_text()
:
Чтобы сделать это для всех обзоров, я прошелся по списку обзоров и снова использовал атрибут class
"review-text":
И, наконец, после небольшой очистки данных, у нас есть следующий список обзоров на Amazon!
Как видите, после того, как вы понимаете структуру HTML-текста на веб-странице, проанализировав страницу, извлечение различной информации на основе тегов и атрибутов довольно просто с использованием BeautifulSoup.
Однако, обратите внимание, что каждый веб-сайт построен по-разному, и, следовательно, способ использования тегов на этом веб-сайте будет отличаться от другого веб-сайта. Если вы парсите другой веб-сайт, скорее всего, у него не будет точно таких же элементов HTML, тегов и атрибутов, как в этом примере. Поэтому важно соответствовать атрибутам с информацией, которую вы пытаетесь извлечь.
Заключительные мысли
В этом кратком посте я рассказал о том, как парсить отзывы покупателей на Amazon с использованием BeautifulSoup в Python. Если вы только начинаете знакомиться с парсингом веб-страниц, надеюсь, это было полезно!
Ресурсы и примеры:
https://pypi.org/project/beautifulsoup4/
https://www.geeksforgeeks.org/implementing-web-scraping-python-beautiful-soup/
https://www.techrepublic.com/article/reference-useful-html-tags-and-their-attributes/