Многие сайты предлагают подписки на новостные рассылки. Но в некоторых случаях хочется отслеживать только определенную информацию. Перечислим ситуации, когда может потребоваться подобный инструмент.
- Вы подумываете купить товар и мониторите уведомления о снижении его цены.
- Вы изучаете материалы о 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 Soupfind
мы извлекли значения из<h3>
и затем выполнили поискnextSibling
, чтобы собрать значенияul
. - На данный момент в списке значится 31 страна. Мы проверяем, изменилось ли число стран с момента последнего сканирования.
Настройка Pipedream
Pipedream — это платформа интеграции API для создания рабочих процессов, управляемых событиями. В статье мы воспользуемся функциональностью отправки e-mail. Самое классное, что вам не нужно иметь собственный домен или настраивать почтовый сервер.
Начало работы с Pipedream
- Создаем аккаунт на 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 в браузере, в результате чего возвращается страница ответа по умолчанию.
Немного доработаем ответ, добавив в действие данный фрагмент кода:
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. Здесь вы можете без затрат разместить одно приложение.
Читайте также:
- Веб-скрейпинг с нуля на Python: библиотека Beautiful Soup
- Как я создал веб-скрапер на Python для поиска жилья
- WebSocket для получения автоматически обновляющихся криптографических данных
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Kirshi Yin: How to Create a Custom Page Crawler With Python