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

  • Вы подумываете купить товар и мониторите уведомления о снижении его цены. 
  • Вы изучаете материалы о COVID-19 на новостном портале и хотите получать сообщения о новых мерах, предпринятых правительством. 
  • Вы проводите исследование и контролируете изменения данных, например цен, с течением времени. 

В этом обучающем руководстве мы научимся отслеживать изменения страниц с помощью такой библиотеки Python, как Beautiful Soup. Кроме того, узнаем, как бесплатно отправить e-mail посредством Pipedream, превосходной платформы low-code для интеграции API.

К делу!

Создание проекта Python 

Устанавливаем необходимые библиотеки: 

pip3 install beautifulsoup4

Создаем новый файл Python со следующим кодом: 

import requests
import time
from bs4 import BeautifulSoup

while True:
url_to_crawl = "https://www.info-coronavirus.be/en/colour-codes-by-country/"
response = requests.get(url_to_crawl)
soup = BeautifulSoup(response.text, "lxml")
h3 = soup.find('h3')

ul_items = [nextSibling for nextSibling in h3.findNextSiblings() if nextSibling.name == 'ul']
li_items = [li for li in ul_items]

for li in li_items:
print (li.text)

print(len(li_items))

# Проверяем, изменилось ли количество li
if len(li_items) <31 or len(li_items) >31:
time.sleep(60)
continue
# запускаем событие отправки e-mail в случае обнаружения изменения
else:
try:
resp = requests.get("https://*****yoururl***.m.pipedream.net")
print(resp.status_code)
except requests.exceptions.RequestException as e:
print (e.reason)

break

Пояснения к коду: 

  • Цикл while возвращает true до тех пор, пока на сайте не происходят изменения. Программа ждет 60 секунд, прежде чем продолжить сканирование. 
  • Скачиваем страницу с помощью библиотеки Python requests. В данном примере выбор пал на страницу со списком стран, пораженных COVID-19 и выделенных разным цветом (зеленым, оранжевым, красным и т.д.) 
  • Для обработки содержимого используем библиотеку Python Beautiful Soup. Она выполняет парсинг страницы, тем самым позволяя искать любые элементы. 
  • Исходный код страницы отображает список стран в теге <li>:

Наша задача  —  извлечь список и зафиксировать число стран. При каждом изменении его размера мы запускаем запрос на отправку e-mail, про конфигурацию которого поговорим в следующем разделе. 

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

  • Список ul_items содержит элементы ul, а li_items  —  элементы li из HTML-исходника. С помощью метода Beautiful Soup find мы извлекли значения из <h3> и затем выполнили поиск nextSibling, чтобы собрать значения ul.
  • На данный момент в списке значится 31 страна. Мы проверяем, изменилось ли число стран с момента последнего сканирования. 

Настройка Pipedream

Pipedream  —  это платформа интеграции API для создания рабочих процессов, управляемых событиями. В статье мы воспользуемся функциональностью отправки e-mail. Самое классное, что вам не нужно иметь собственный домен или настраивать почтовый сервер.  

Начало работы с Pipedream

  1. Создаем аккаунт на Pipedream.

2. Заходим в учетную запись и переходим на вкладку Workflows (рабочие процессы). Нажимаем на кнопку New для создания рабочего процесса. 

3. Выбираем HTTP API в качестве триггера. 

4. На следующем экране нажимаем знак “+” для добавления блока (step)

Добавляем “Send yourself an email” (“Отправить себе e-mail”). Обратите внимание, что данное действие отправит сообщение на адрес электронной почты, указанной при регистрации. 

Добавляем свои тему (subject) и тело (body). 

Блок сопровождается предварительно подготовленным кодом (действием):

async (event, steps, param) ==> {
const options = {
subject: params.subject,
text: params.text,
}
if (params.html) {
options.html = params.html
}
if (params.include_collaborators) {
options.include_collaborators = params.include_collaborators
}
$send.email(options)
}

5. Нажимаем Save (Сохранить) и затем Deploy (Развернуть).

Например, в рассматриваемом примере настройки для блока по отправке e-mail выглядят так: 

Тестирование рабочего процесса 

Копируем уникальный URL из верхней части экрана steps.trigger:

URL для запуска рабочего процесса 

Открываем URL в браузере, в результате чего возвращается страница ответа по умолчанию. 

Немного доработаем ответ, добавив в действие данный фрагмент кода: 

async (event, steps, params) ==> {
const options = {
subject: params.subject,
text: params.text,
}
if (params.html) {
options.html = params.html
}
if (params.include_collaborators) {
options.include_collaborators = params.include_collaborators
}
$send.email(options)
$respond({
status: 200,
headers: { "my-custom-header": "value" },
body: { message: "Everything is fine. Email has been sent." }, // Это может быть строка, объект, буфер или читаемый поток
});
}

Сохраняем и развертываем снова. Если сейчас вызвать URL, то получим e-mail и увидим пользовательское сообщение в браузере:  

{"message":"Everything is fine. Email has been sent."}

Соединение Pipedream с Python

Осталось лишь соединить сканер страниц с конвейером электронной почты. 

Возвращаемся к коду Python и вставляем URL в часть requests.get().

Каждый раз, когда скрипт обнаруживает изменение, Pipedream отправляет e-mail. 

Заключение 

Из этого краткого руководства вы узнали:

  • как обнаружить изменения на сайте с помощью Python и библиотеки Beautiful Soup;
  • как настроить отправку e-mail с Pipedream. 

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

В реальной жизни программа сканирования страниц выполняется на удаленном сервере или размещается в облаке. Если вы ищите бесплатное решение, то рассмотрите вариант с платформой Heroku. Здесь вы можете без затрат разместить одно приложение. 

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Kirshi Yin: How to Create a Custom Page Crawler With Python

Предыдущая статьяСтруктуры данных: связный список
Следующая статьяЯзык С: классы памяти