CoderCastrov logo
CoderCastrov
Beautifulsoup

Начало работы с парсингом веб-страниц: отзывы Amazon с помощью BeautifulSoup

Начало работы с парсингом веб-страниц: отзывы Amazon с помощью BeautifulSoup
просмотров
6 мин чтение
#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.blazemeter.com/blog/scrapy-vs-selenium#:~:text=Selenium%20is%20an%20excellent%20automation,requests%2C%20Selenium%20can%20work%20better

https://www.techrepublic.com/article/reference-useful-html-tags-and-their-attributes/