Супер простой и понятный способ непрерывно отслеживать изменения на веб-сайтах.

В поисках интересных мероприятий для детей во время COVID я заметил, что все билеты были распроданы быстрее, чем я мог их проверить! Если бы только был способ предупредить меня по электронной почте, когда веб-сайт изменился с «Продано» на «Доступно»… Ой, подождите… Я знаю, как это сделать.

План

Все, что я собираюсь сделать здесь, это настроить скрипт Python, который будет подключаться к моей учетной записи Gmail через пароль приложения (о котором я расскажу позже), а затем проанализирую веб-сайт на наличие изменений. Когда на сайте появятся изменения, которые я хочу, все, что я сделаю, это вызову электронное письмо! БУМ!

Пароль приложения Gmail

Первое, что нужно сделать, это убедиться, что вашей учетной записи Gmail разрешено отправлять электронные письма через программу. Лучший способ сделать это — сгенерировать пароль приложения. В основном это действует как ключ API для вашей собственной учетной записи. Чтобы настроить это, я перечислю точные шаги в разделе справки Gmail:

  1. Зайдите в свой Аккаунт Google.
  2. Выберите Безопасность.
  3. В разделе «Вход в Google» выберите «Пароли приложений». Возможно, вам потребуется войти в систему. Если у вас нет этой опции, это может быть связано с тем, что:

А) Двухэтапная аутентификация не настроена для вашего аккаунта.

Б) Двухэтапная аутентификация настроена только для электронных ключей.

C) Ваш аккаунт связан с работой, учебным заведением или другой организацией.

Г) Вы включили Дополнительную защиту.

4. Внизу выберите Выбрать приложение и выберите приложение, которое вы используете › Выберите устройство и выберите устройство, которое вы используете › Создать.

5. Следуйте инструкциям, чтобы ввести пароль приложения. Пароль приложения — это 16-значный код на желтой полосе на вашем устройстве.

6. Нажмите Готово

Вот как это выглядит:

Установить пакеты пипсов

Если они у вас еще не установлены, вам понадобится BeautifulSoup4 и запросы:

pip install BeautifulSoup4 
pip install requests

Далее нам нужно указать, какие изменения мы хотим обнаружить. Для этого перейдите на целевой URL. В данном случае я использую: https://rockevents.ca/event/outdoor-classroom/

Я хочу продолжать проверять элемент формы внизу. Я открываю инспектор и нахожу идентификатор формы «tribe-tickets».

Все, что осталось, — это закодировать цикл, чтобы отслеживать изменения и отправлять электронное письмо!

import smtplib
import bs4
import requests
import time
# Set up the send account and general email details
gmail_user = '[email protected]'
gmail_password = 'YOUR APP PASSWORD'
sent_from = gmail_user
to = ['[email protected]', '[email protected]']
subject = 'outdoor-classroom Change Detected'
# Set the target URL and request the site and look for the ID tag
url = 'https://rockevents.ca/event/outdoor-classroom/'
source = requests.get(url).text
soup = bs4.BeautifulSoup(source,'html.parser')
event_string = str(soup.find('form', id='tribe-tickets'))
# Start a loop where every min we check the site again
while True:
    time.sleep(60)
    print('Checking site')
    source = requests.get(url).text
    soup = bs4.BeautifulSoup(source,'html.parser')
    event_string_new = str(soup.find('form', id='tribe-tickets'))
    # If the html of the form has changed trigger the email!
    if event_string!=event_string_new:
        body = 'Change on the site:' + url
        email_text = """\
        From: %s
        To: %s
        Subject: %s
        %s
        """ % (sent_from, ", ".join(to), subject, body)
        try:
            # SEND THE EMAIL!!!!
            server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
            server.ehlo()
            server.login(gmail_user, gmail_password)
            server.sendmail(sent_from, to, email_text)
            server.close()
            event_string = event_string_new
        except:
            print ('Something went wrong...')

Вау, это довольно легко!

Запуск навсегда

Так что вопрос в том, как долго это будет работать. Если вы работаете локально, вы можете просто оставить свой компьютер включенным и запустить это в фоновом режиме:

nohup python script.py

Лично мне нравится использовать Cloud9 от AWS, который представляет собой интегрированную среду разработки. Дайте ему посмотреть. Чтобы запустить мой скрипт Python в фоновом режиме, все, что я делаю, это запускаю дополнительный терминал:

Cloud9 IDE:> screen -S MyJob
Cloud9 IDE:> python script.py
CTRL+a+d to exit

Вы также можете настроить время ожидания сеанса инстанса EC, зайдя в настройки и выбрав, чтобы он никогда не спал (имейте в виду, что вы понесете расходы).

Дайте знать, если у вас появятся вопросы!!!