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

Предпосылки

  • Raspberry Pi (Не обязательно, достаточно ноутбука). В сети есть масса проектов Raspberry Pi; большинство этих проектов требует некоторой электротехники. Однако наши варианты использования будут просто использовать Raspberry Pi в качестве сервера для парсинга веб-страниц, который работает круглосуточно и без выходных.
  • Python 3. Python - это язык с множеством мощных библиотек, который легко запустить и создать прототип нового приложения. Поскольку Python 2 завершает свою жизнь 1 января 2020 года, в этом случае мы собираемся использовать Python 3.
  • Scrapy. Один из лучших фреймворков для парсинга веб-страниц с открытым исходным кодом на Python. Scrapy - это мощный и очень быстрый инструмент; это ядро ​​нашего набора инструментов. Хотя были разработаны новые версии, основные компоненты не сильно изменились. В этой статье используется самая последняя версия Scrapy 2.0.1 на Python 3.6.10.
  • Современный браузер. Современный браузер с включенными инструментами разработчика, который помогает очень легко проверять объекты и извлекать HTML-теги.

Веб-сайт

Многие сайты предоставляют информацию о скидках и промокодах, например, SlickDeals, Dealnews и DealMoon. В HTML будут различные компоненты для извлечения, но выбор веб-сайта с вашими интересами здесь не ограничен. Важнейшая часть успешного парсинга - выбор сайта с достаточным объемом трафика. В этой статье мы будем использовать SlickDeals в качестве нашего парсера.

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

  1. Перейти на сайт SlickDeals
  2. Большинство выгодных предложений находится в разделе Frontpage Slickdeals. Каждый товар содержит следующую информацию, включая изображение продукта, название продукта, магазин / веб-сайт продукта, текущую цену, первоначальную цену, отметки "Нравится" / "Нравится", информацию о доставке.

3. Откройте инструмент разработчика в браузере или проверьте элемент на веб-сайте. Большинство инструментов разработчика должны уметь выделять ваш выбор и фокусироваться на выбранном HTML-теге. Важным шагом здесь является поиск аналогичного шаблона для извлечения данных в цикле Python. Если вы перейдете к следующему элементу, вы можете снова увидеть тот же тег. В этом конкретном случае тег div с классом «fpItem» распознается для каждого элемента - <div class=”fpItem”>

4. Как только мы сможем идентифицировать<div class=”fpItem”>, нам нужно получить остальные данные от его родителя. Чтобы получить имя каждого класса, вы можете повторить шаги, упомянутые выше, используя Инструменты разработчика в браузере, получить все интересующие нас поля и извлечь их.

Код Scrapy

Со всей информацией о том, из какого класса извлекать данные. Мы можем просто поместить все в проект Python Scrapy и выполнить тестовый запуск. Вы можете узнать больше о Scrapy здесь.

Приведенный выше код представляет собой файл spider.py в папке Scrapy's Spider. Во-первых, мы определяем имя сканера - «slickdeals». Затем, как мы обсуждали выше, нам нужно получить элемент списка с помощью Selector и вызова

deal_items = Selector(response).xpath(‘//div[contains(@class, “fpItem”)]’)

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

store = item.xpath(‘.//a[contains(@class,”itemStore”)]/text()’).extract() title = item.xpath(‘.//a[contains(@class,”itemTitle”)]/text()’).extract() title_link = item.xpath(‘.//a[contains(@class,”itemTitle”)]/@href’).extract() price = item.xpath(‘.//div[contains(@class,”itemPrice”)]/text()’).extract() original_price = item.xpath(‘.//span[contains(@class, “oldListPrice”)]/text()’).extract()

В конце концов, мы сохраняем данные в файле CSV, чтобы провести дополнительный анализ. Вы можете сами отправить электронное письмо с нужным ключевым словом. Здесь можно использовать модуль Python email, ниже приведен пример без содержания.

import smtplib
from email.message import EmailMessage
msg['Subject'] = f'A Deal of XXX is Found on SlickDeals'
msg['From'] = f'[email protected]'
msg['To'] = f'[email protected]'
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

Чтобы протестировать запуск этой программы, в корневом каталоге проекта просто выполните

scrapy crawl slickdeals

И теперь результат будет выглядеть примерно так, и вы увидите поля, которые мы извлекли.

2020–04–18 21:00:10.552354,Sam Ash ,Taylor Guitars 317e Grand Pacific Acoustic-Electric Guitar w&sol; Hardshell Case,/f/13990862-taylor-317e-grand-pacific-acoustic-electric-guitar-1000-off-ymmv-999?src=frontpage,$999,$1999,34,52

Расписание

Поскольку программа будет работать круглосуточно, без выходных, энергоэффективный Raspberry Pi будет иметь больше смысла для достижения цели. После проверки выполнения кода мы можем запланировать запуск приложения-поискового робота через crontab Linux.

Вы можете начать с crontab -e, а затем добавить следующую команду. Мы собираемся запускать веб-сканер каждые 15 минут с помощью crontab */15 * * * *

SHELL=/bin/bash
*/15 * * * * cd /home/pi/projects/slickdealscrapy && /home/pi/.pyenv/shims/scrapy crawl slickdeals >> /tmp/mycommand.log 2>&1

Последняя мысль

Поздравляю! Вы создали программу для парсинга веб-страниц, работающую круглосуточно и без выходных, в соответствии с заданным вами запросом. Независимо от того, какова ваша цель: поиск хороших предложений, бесплатных подарков, купонов; Наша небольшая программа работает очень интенсивно и тихо в нашем бэк-офисе, она отслеживает лучшие предложения для вас и отправляет вам уведомление о своих выводах. Я надеюсь, что эта статья может предоставить вам как понимание, так и возможности веб-скрейпинга, чтобы вы могли начать создавать более сложные программы на небольшом устройстве, таком как Raspberry Pi.

Если вам понравилась эта статья, пожалуйста, поддержите меня в ладоши.