CoderCastrov logo
CoderCastrov
Парсер

Как создать приложение для сравнения цен в электронной коммерции с использованием Selenium и TkInter

Как создать приложение для сравнения цен в электронной коммерции с использованием Selenium и TkInter
просмотров
7 мин чтение
#Парсер

Парсинг веб-страниц

Мотивация

Из моего многолетнего опыта активного потребителя электронной коммерции я заметил определенные неудобства при покупке интересующего товара. Одной из таких затратных по времени проблем является поиск лучшей цены на этот товар. С помощью всего одного запроса на этих сайтах электронной коммерции мы часто оказываемся прокручивая множество товаров, чтобы найти тот, у которого больше всего рейтингов и положительных отзывов за минимальную цену. Вариантов покупки чего-либо в Интернете так много, что мы часто запутываемся от количества открытых вкладок и кнопок "Сравнить цены" (которые иногда даже отсутствуют).

Рассмотрим, например, покупку наушников. Вы тратите значительное время на исследование брендов, характеристик, плюсов и минусов этого товара, пока выбираете тот, который удовлетворяет ваши потребности. После того, как вы, наконец, выбрали один, перед вами стоит такая же трудная задача: определить, в каком магазине приобрести товар. Некоторые магазины предлагают его со скидкой в $50, в то время как другие - нет. Другие продавцы предлагают еще большую скидку, хотя их рейтинги продавцов так высоки, как вам бы хотелось. Разброс продолжает увеличиваться, и вы еще больше запутываетесь при совершении простой покупки. Что, если бы мы могли автоматизировать этот процесс для поиска оптимальной покупки?

Поскольку наше полагание на электронную коммерцию продолжает расти каждый день, было бы большим преимуществом иметь инструмент, который автоматизирует трудоемкий процесс сравнения цен на основе рейтинга, количества рейтингов и цены. В этой статье я покажу вам, как создать веб-парсер на Python, который способен сделать именно это!



Наш список дел

Прежде чем мы начнем, давайте определим, что именно мы собираемся делать. Я ограничиваю объем этого проекта Amazon и eBay, пожалуй, двумя самыми популярными электронными коммерческими компаниями на сегодняшний день. К концу этой статьи мы:

  • Используем библиотеки BeautifulSoup и Selenium в Python для парсинга данных с Amazon и eBay
  • Сортируем набор данных на основе количества оценок и цены, получая оптимальные 10 потенциальных покупок
  • Создаем графический интерфейс пользователя с использованием библиотеки TkInter, который будет удобен в использовании, чтобы все объединить

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

"Остерегайтесь маленьких расходов; небольшая утечка потопит большой корабль" - Бенджамин Франклин

The Scrapers

Для этого анализа мы сначала создаем два парсера, по одному для каждого веб-сайта. Сначала мы хотим, чтобы пользователь вводил поисковый запрос и диапазон страниц для парсинга. Например, если мы ищем "морскую соль" и вводим диапазон страниц 5, мы хотим, чтобы наш скрипт посетил веб-страницу Amazon/eBay и итеративно собрал информацию о морской соли до достижения конца 5-й страницы.

Теперь, когда у нас есть цель, давайте перейдем к коду. Сначала нам нужно преобразовать синтаксис поискового запроса, чтобы он соответствовал способу построения URL-адреса. Мы можем получить общий базовый URL, используя домены веб-сайтов, за которыми следует отформатированный поисковый запрос, а затем номер страницы, которую мы хотим спарсить. Используя этот конкретный URL, мы можем использовать API Selenium, чтобы направить наш парсер на него и получить любую информацию, которую мы хотим.

Каждый элемент веб-страницы состоит из атрибутов HTML. После нахождения конкретных тегов, соответствующих элементам на этой странице, мы можем получить все элементы, которые попадают под эти теги. Используя API BeautifulSoup, мы можем непосредственно получить доступ к HTML-коду веб-страницы и сделать это. Знание, какие теги искать, является процессом проб и ошибок. Начните с печати любого HTML-кода, который возвращает ваш запрос на основе тегов, и изменяйте их, пока не получите нужный элемент.

В моей реализации я использую Chrome в качестве браузера по умолчанию. Какой бы браузер вы ни выбрали, убедитесь, что вы измените тип веб-драйвера, который вы используете в Selenium. Теперь, когда ваш парсер знает, какую ссылку посетить, мы сталкиваемся с следующей проблемой: итерация по разным страницам. Способ подхода к этому довольно прост. На изображении выше мы поместили фигурные скобки в самом конце для форматирования по номеру страницы. Теперь все, что нам нужно сделать, это настроить цикл for, который содержит код парсера, форматируя по номеру страницы на каждой итерации и собирая всю информацию о продукте на этой странице. Мы используем функцию "find" в API BeautifulSoup для парсинга HTML-тегов, содержащих эту информацию.

С помощью этого мой парсер может извлекать имя, цену, состояние, URL, стоимость доставки, средний рейтинг и количество рейтингов для каждого продукта на странице. Иногда мы получаем пустой запрос для этих информационных фрагментов. Поэтому необходимо использовать операторы try для обхода ошибок. Я создал списки для хранения извлеченной информации, обеспечивая наличие заполнителей, если отсутствует информация. Это было сделано для того, чтобы каждый список поддерживал согласованность информации. Мы легко можем удалить наблюдения по индексу позже.

Надеюсь, вышеизложенное объяснение имеет смысл само по себе, но на всякий случай вот код для парсера eBay здесь! Чтение комментариев, которые я написал параллельно с кодом, лучше иллюстрирует точки, которые я ранее упомянул.

Та же логика применяется при создании парсера Amazon. Если вы хотите посмотреть код для него, вы можете найти его в моем репозитории GitHub здесь. Теперь, когда у нас есть два парсера, нам нужна внешняя функция, которая принимает полученные наборы данных и предварительно обрабатывает их. Я сделал это в функции "main" в репозитории GitHub. Внутри функции я преобразовал строковые переменные в числовые, чтобы сортировать по количеству рейтингов для каждого продукта. Это метрика, которую я выбрал при фильтрации топ-10 элементов в запросе. Эту метрику легко можно настроить в соответствии с вашими предпочтениями.

Создание графического интерфейса (GUI)

Теперь, когда у нас есть созданный парсер, давайте попробуем сделать его инструментом, который смогут использовать другие люди! Я создал графический интерфейс с помощью библиотеки TkInter в Python. Это API предоставляет удобный и эффективный способ создания дружественного пользовательского интерфейса для скрапера.

В этой библиотеке есть несколько модулей, которые вы можете использовать, чтобы получить виджеты в интерфейсе. Для этого проекта мы используем четыре:

  • tk.Canvas: Используется для установки размеров окна приложения
  • tk.Frame: Создает прямоугольную область, в которой можно разместить выбранный виджет
  • tk.Entry: Создает текстовое поле, в которое пользователь может вводить текстовые данные
  • tk.Button: Создает кнопку, которая при нажатии может вызвать функцию (в нашем случае это будет функция парсера)

Также важно отметить три способа настройки макета ваших виджетов. В библиотеке TkInter есть три способа, которые вы можете использовать: place, pack и grid. Для нашего проекта мы используем метод "place" исключительно. По моему мнению, это самый простой способ размещения ваших виджетов, поскольку этот метод позволяет задавать абсолютные значения x и y. Если вам интересны другие два метода, вы можете прочитать о них здесь.

В моем приложении я создал шесть фреймов. Один из них содержит строку поиска, где пользователь может ввести интересующий его продукт. Два из них служат фоном для холста. Один фрейм содержит два других под-фрейма, которые отображают два набора данных, полученных из скрипта парсера. Затем я создал две панели инструментов для ввода: одну для названия продукта и другую для максимального номера страницы, с которой нужно получить данные о продукте. Наконец, я добавил кнопку "Сравнить". При нажатии на нее вызывается функция "main", о которой мы говорили ранее, и возвращаются две отсортированные таблицы данных.

Давайте посмотрим, как работает это приложение. Я использовал поиск наушников Bose nc700 в качестве примера. Я попросил приложение собрать данные с первых двух страниц eBay и Amazon и отсортировать их согласно моей функции, возвращая лучшие 10 запросов для обоих веб-сайтов. Вот наш конечный продукт:

Application interface and output example

Исходя из отсортированных таблиц данных, мы видим, что лучшие 10 вариантов продукта на eBay и Amazon не имеют большой разницы в цене. Поэтому покупка с любого из этих веб-сайтов будет достаточной, если вы не хотите сэкономить около 50 долларов, покупая восстановленный продукт.

Теперь, когда у вас есть представление о том, как это работает, вы можете создать свой собственный парсер и добавить еще больше веб-сайтов для сравнения. Однако вам потребуется немного изменить запросы HTML-тегов и URL-адрес веб-сайта. При выполнении этого внимательно изучайте атрибуты веб-сайта и экспериментируйте с различными запросами HTML, пока не получите нужную информацию.


Как видно, этот инструмент может быть очень полезен для сравнения предложений по продуктам на разных веб-сайтах и сэкономит много времени. Вместо того, чтобы просматривать различные вкладки и прокручивать бесконечное количество продуктов, у нас есть лучшие варианты покупки под рукой!

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