Работать во сне

В этой статье я покажу вам, как приступить к созданию Системы мониторинга веб-элементов или просто WEMS для краткости.

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

Идея состоит в том, что с помощью Python вы можете автоматизировать все, что вы делаете в браузере, включая:

  • Проверяйте цены на авиабилеты или обувь, которую вы всегда хотели, каждые 5 минут и получайте уведомления, когда цена падает ниже указанной суммы.
  • Получение уведомлений, когда вы получаете «нравится» на публикацию.
  • Мониторинг любого текстового элемента на сайте.

Мы создадим все это в одном приложении, используя только Python.

Селен

Автоматизация браузера в Python обычно выполняется с помощью библиотеки под названием Selenium.

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

По сути, все, что вы можете себе представить в браузере.

В этом уроке мы не будем глубоко погружаться в Selenium, хотя я думаю, что это тоже была бы отличная статья.

Нет. Мы сосредоточимся на создании вышеупомянутого приложения WEMS.

Но чтобы начать, нам нужен Selenium для работы.

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

Теперь вам может понадобиться указать полный путь к загруженному драйверу в переменной PATH. Если вы не знаете, как это сделать, вы можете погуглить «Добавить в переменную пути».

Вам также следует pip install selenium или, возможно, pip3 install selenium, если вы работаете на Mac или Linux.

Причина, по которой я выбрал Selenium для поиска текстовых элементов на веб-страницах, а не что-то вроде Beautiful Soup, заключается в том, что многие страницы используют динамический контент, созданный с помощью JavaScript.

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

Это делает его немного медленнее, но более гибким. Таким образом, мы фактически можем отслеживать цены, например. Amazon, заполненный динамическим контентом.

Приложение WEMS

Теперь самое интересное.

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

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

Нижний модуль — это двигатель. Что я объясню более подробно чуть позже. Я изначально создал его для мониторинга цен на веб-сайтах, поэтому я назвал основной класс в этом модуле PriceScraper.

Здесь следует отметить следующее:

  • Для каждого веб-сайта, который мы отслеживаем, у нас может быть несколько элементов для проверки. Мы делаем это в цикле for.
  • Мы используем Xpath для поиска элементов. Мы делаем это исходя из предположения, что если текст на веб-сайте меняется, это не обязательно означает, что меняется структура/HTML-дерево. Другими словами, они меняют только текст.
  • Есть несколько возможных значений, возвращаемых сканированием, и нам нужно обрабатывать их все удобным для пользователя способом.
  • Здесь мы предполагаем, что исполняемый файл geckodriver находится в папке с именем «geckodriver». Вы должны заменить это на местоположение вашего исполняемого файла.

Мы также обновляем документ JSON под названием «url_data.json» с выводами, которые сыграют свою роль позже.

UI

Код внешнего интерфейса построен в библиотеке Python Kivy, что, конечно же, является выбором дизайна.

Это все еще продолжается, и вы увидите некоторые функции, реализованные лишь наполовину, например, меню настроек.

Вы должны закончить это сами :-).

Здесь также есть несколько вещей, на которые следует обратить внимание.

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

Я указал интервал по умолчанию между сканированиями, равный 5 минутам. Это по двум основным причинам:

  1. Если мы делаем частые запросы на веб-сайте, они могут заблокировать наш IP-адрес, а этого точно не может быть.
  2. Напомним, что наш класс PriceScraper читает документ JSON «url_data.json» и обновляет его. На самом деле это может конфликтовать с удалением URL-адреса из приложения, если вы попытаетесь удалить его во время сканирования.

Если это произойдет, вы, казалось бы, удалите URL-адрес на мгновение, но затем он появится снова немного позже, потому что содержимое JSON находилось в ОЗУ, когда вы обновляли файл.

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

Приложение не сломается, вы просто не удалите URL-адрес.

Это, конечно, то, что мы можем исправить в будущем.

Я решил написать приложение, используя только классы Python, а не kv-файлы. Это осознанный выбор, но вы, конечно, можете изменить его, если хотите.

Тестирование приложения

Давайте протестируем приложение.

Запустите файл main.py, и вы увидите, как открывается наше приложение. Это будет выглядеть следующим образом:

Если вы нажмете кнопку «Добавить URL», то увидите еще одно окно, в котором можно добавить сайт для мониторинга.

Чтобы начать мониторинг, вам нужно будет вставить две вещи. Веб-адрес и элемент в виде Xpath.

Перейдем на страницу ниже:



Мы можем просто скопировать и вставить URL/веб-адрес в наше приложение в первое поле.

Чтобы получить Xpath элемента, нажмите ctr+Shift+I, чтобы открыть проверить. Кроме того, вы можете щелкнуть правой кнопкой мыши в любом месте страницы и выбрать параметр проверки.

Затем нажмите «стрелку» в левом углу панели. Затем вы щелкаете элемент, который хотите найти на странице.

Часть HTML будет выделена на вкладке элементы. Щелкните его правой кнопкой мыши и скопируйте файл Xpath.

Вы можете увидеть скриншот этого ниже.

Теперь вы можете вставить Xpath в поле «Xpath для поиска».

Нажмите Добавить. Вы увидите журнал консоли, сообщающий, что вы только что добавили URL-адрес и элемент для мониторинга.

Теперь вы можете вернуться в раздел «просмотреть отслеживаемые URL-адреса». Перед обнаружением будет элемент с именем «.

При обнаружении нового элемента вы получите push-уведомление.

Вы можете нажать кнопку обновления и увидеть URL-адрес и элементы, которые мы отслеживаем.

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

Если вы нажмете на обновление изменения цены, вы перейдете на страницу мониторинга.

В приведенном выше примере я сжульничал, вручную жестко закодировав начальную цену в JSON. Когда сканер просматривал веб-страницу в фоновом режиме, он увидел элемент $179,99 как изменение элемента!

Небольшое, но важное замечание:

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

Было бы очень хреново, если бы вы не могли пользоваться услугами Google, потому что вы не читали их условия и случайно засыпали их запросами на блокировку вашего IP.

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

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

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

При этом мне удалось отслеживать просмотры на YouTube, лайки в LinkedIn, цены на продукты Amazon и многое другое.

Не стесняйтесь использовать его по своему усмотрению, но, пожалуйста, будьте ответственны.

Увидимся в следующий раз.

Если у вас есть какие-либо вопросы, комментарии или опасения по поводу этой статьи, не стесняйтесь обращаться к LinkedIn.