CoderCastrov logo
CoderCastrov
Парсер

Парсинг с использованием Selenium + Heroku + Telegram Bot (Часть 1)

Парсинг с использованием Selenium + Heroku + Telegram Bot (Часть 1)
просмотров
6 мин чтение
#Парсер

Введение (можно пропустить)

Часто мы сталкиваемся с информацией, которая изменяется на некоторых веб-сайтах, и мы хотели бы получать персонализированные уведомления. Например, мы хотели бы получать оповещение, если определенная цена акции достигает определенной суммы, или если товар на Amazon снижается в цене...

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

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

  • Легкий: Существует API, которую предоставляет оригинальный поставщик данных. Например, мы хотим узнать погоду в нашем городе и получать уведомления, когда идет дождь и т.д. В этом случае нам просто нужно найти OpenWeatherMap и зарегистрироваться в их API, и мы можем легко подключить нашего бота к OpenWeatherMap, достаточно немного поискать в Google, так как этот пример очень распространен и часто встречается в учебниках среднего уровня.
  • Сложный: Нет API (или она есть, но нам ее не дают). В этом случае нам нужно извлечь информацию, используя сам веб-сайт, притворяясь, что наш бот - это человек, который заходит на веб-сайт, что известно как "парсинг веб-страниц".

Что такое парсер?

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

Если веб-сайт небольшой, скорее всего у него нет механизмов против парсинга, таких как CAPTCHA (которые, кстати, являются аббревиатурой от "Completely Automated Public Turing test to tell Computers and Humans Apart" - полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей).

В случае наличия CAPTCHA у нас есть два варианта, снова легкий и сложный.

Легкий способ - сменить IP-адрес, чтобы наша система каждый раз получала доступ к сервису с другим IP-адресом и всегда получала данные.

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

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

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

При слишком большом количестве запросов в минуту мы также наносим вред владельцу веб-сайта, так как перегружаем сервер, и это может рассматриваться как атака отказа в обслуживании (DDoS).

Сказав это, мы можем приступить к делу, зная технические ограничения и последствия, которые могут возникнуть для поставщика услуг.

В этом примере мы извлечем ежедневные предложения с amazon.com и сможем просматривать их с помощью бота Telegram.

Веб-страница с ежедневными предложениями находится здесь: https://www.amazon.es/gp/goldbox?tag=wasubi0a-21

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

Если мы проанализируем JavaScript-код этой страницы, мы обнаружим, что веб-страница генерируется динамически, поэтому, если мы используем базовый модуль Python, такой как Beautiful Soup, для парсинга веб-страницы, мы не получим ничего полезного, так как мы не можем построить конечный HTML без движка JavaScript.

Именно это делает браузер: он загружает начальный HTML с указанного URL, если есть JavaScript, он интерпретирует его и создает DOM, который представляет веб-страницу в абстрактной форме внутри нашего браузера.

Парсинг динамических веб-страниц с использованием Selenium и Python (начните здесь, если вы знаете, что такое парсер)

Selenium - это инструмент для автоматического тестирования веб-страниц, обычно он очень полезен для фронтенд-разработчиков и специалистов по контролю качества.

Но мы можем использовать его на веб-страницах, которые не являются нашими, и автоматически переходить по этим страницам. Именно это мы собираемся сделать с помощью Amazon.

Шаг 1: Установка Selenium

Я буду использовать Chrome для парсера, хотя могу использовать и Firefox, я использую Chrome, потому что есть больше документации, хотя это действительно личное решение.

Selenium требует наличия установленного браузера, поэтому, если у вас нет Google Chrome, вам нужно его установить.

Вы должны узнать свою версию Chrome chrome://settings/help

Загружаем ChromeDriver, совместимый с нашей версией Google Chrome:


Загрузки - ChromeDriver - WebDriver для Chrome

WebDriver для Chrome

WebDriver для Chrome ссылка

Теперь мы должны открыть консоль, чтобы установить Selenium в нашу среду Python.

$ pip install selenium

Базовый код

Вот шаблон кода, с которого вы можете начать

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, WebDriverException
from selenium.webdriver.chrome.options import Options
import osCHROMEDRIVER_PATH = os.environ.get('CHROMEDRIVER_PATH', '/usr/local/bin/chromedriver')
GOOGLE_CHROME_BIN = os.environ.get('GOOGLE_CHROME_BIN', '/usr/bin/google-chrome')
options = Options()
options.binary_location = GOOGLE_CHROME_BIN
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.headless = Truedriver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, chrome_options=options)# Парсинг
url = 'https://www.amazon.es/dp/B006CZ0LGA'driver.get(url)el = driver.find_element_by_id('priceblock_ourprice')print(el.text)

Возможно, вы правильно установили Selenium, но все равно получаете эту ошибку:

FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/bin/chromedriver': '/usr/local/bin/chromedriver'selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see [https://sites.google.com/a/chromium.org/chromedriver/home](https://sites.google.com/a/chromium.org/chromedriver/home)

Это происходит потому, что у вас нет драйвера для вашего браузера Chrome в этом пути. Если вы его загрузили и не переместили, он должен находиться в папке "Загрузки". Вы также можете изменить путь в коде, чтобы он искал драйвер в другой папке, даже в "Загрузках", но это менее чистое решение.

Анализ кода

В коде мы создаем драйвер, то есть браузер, который мы будем использовать для парсинга Amazon. Опции выбраны таким образом, чтобы они работали на сервере без графического интерфейса, без GPU и с минимальными требованиями, как в случае с динами Heroku.

Способ загрузки chromedriver и google-chrome осуществляется через переменные среды, которые позволяют нам проводить тесты как локально, так и на Heroku при развертывании.

После создания драйвера мы будем использовать его для извлечения информации с конкретного веб-сайта, в данном случае с веб-сайта продукта Amazon, и извлекаем его цену.

Это URL и то, что мы видим с помощью Chrome.

Если мы щелкнем правой кнопкой мыши на цене и выберем "Проверить элемент", мы сможем увидеть его идентификатор и затем найти элемент в DOM с помощью Selenium.

Поэтому мы ищем элемент, где находится цена, так:

el = driver.find_element_by_id('priceblock_ourprice')

Вот ссылка на вопрос на StackOverflow, который может прояснить ситуацию.

Запуск ChromeDriver с помощью Python selenium на Heroku

Благодарим за ответ на вопрос на Stack Overflow! Пожалуйста, убедитесь, что вы отвечаете на вопрос. Предоставьте подробности и поделитесь...

stackoverflow.com

В следующей части мы рассмотрим, как развернуть парсер на Heroku и как подключить его к Telegram.

Здесь вы можете посмотреть мой исходный код.

RNogales94/Selenium-Heroku-Python-POC

Простой пример концепции парсера веб-страниц с использованием Selenium внутри приложения на Python и развернутого на Heroku...

github.com

Если вы хотите связаться со мной, вы можете сделать это через Telegram или LinkedIn, и мы можем обсудить ваш проект.

Вторая часть здесь https://planetachatbot.com/scraping-dinamico-con-selenium-heroku-telegram-bot-parte-2-f657ac030fb5