PR

Mac環境でのWebページ更新されたらメールに通知するプログラム【WEBスクレイピング】

難しいことも多いですが新しいことを学び、作ったプログラムがうまく起動すると楽しいですね

本記事では、Webページの更新を自動でチェックし、更新があった場合にメールで通知するPythonプログラムを紹介します。以下の内容に沿って進めます。

1. 必要なインストール

まず、以下のライブラリをインストールする必要があります。ターミナルを開き、以下のコマンドを実行してください。

pip install requests beautifulsoup4 pyyaml

また、メール送信のために smtplib ライブラリも使用しますが、これは標準ライブラリのため、追加のインストールは不要です。

2. プログラムごとの説明

load_urls関数

urls.yamlファイルからURLとその最後のコンテンツを読み込みます。

def load_urls():
    with open('urls.yaml', 'r') as file:
        return yaml.safe_load(file)

check_updates関数

指定されたURLにアクセスし、現在のコンテンツを取得します。以前のコンテンツと比較して、更新があればTrueを返します。

def check_updates(url, last_content):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    current_content = soup.get_text()

    if current_content != last_content:
        return True, current_content
    return False, last_content

send_email関数

更新があった場合にメールで通知します。SMTPサーバーの情報、送信元および送信先のメールアドレス、パスワードを設定する必要があります。

def send_email(subject, body):
    smtp_server = "あなたの情報"
    port = 587  # TLSの場合は587
    sender_email = "あなたの情報"  # 送信元のメールアドレス
    receiver_email = "あなたの情報"  # 送信先のメールアドレス
    password = "あなたの情報"  # 送信元メールアドレスのパスワード

    message = MIMEText(body)
    message["Subject"] = subject
    message["From"] = sender_email
    message["To"] = receiver_email

    try:
        with smtplib.SMTP(smtp_server, port) as server:
            server.ehlo()
            server.starttls()
            server.login(sender_email, password)
            server.send_message(message)
        print("メールが正常に送信されました")
    except Exception as e:
        print(f"メール送信中にエラーが発生しました: {e}")

main関数

load_urlsで読み込んだURLリストを基に、各URLの更新をチェックし、更新があった場合にメール通知を行います。その後、最新のコンテンツでurls.yamlを更新します。

def main():
    urls = load_urls()

    for url, last_content in urls.items():
        updated, new_content = check_updates(url, last_content)

        if updated:
            subject = f"更新があります: {url}"
            body = f"ウェブサイト {url} が更新されました。"
            send_email(subject, body)

            urls[url] = new_content

    with open('urls.yaml', 'w') as file:
        yaml.dump(urls, file)

if __name__ == "__main__":
    main()

3. 全体のプログラム

全体のプログラムは以下の通りです。

import requests
from bs4 import BeautifulSoup
import yaml
import smtplib
from email.mime.text import MIMEText

def load_urls():
    with open('urls.yaml', 'r') as file:
        return yaml.safe_load(file)

def check_updates(url, last_content):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    current_content = soup.get_text()

    if current_content != last_content:
        return True, current_content
    return False, last_content

def send_email(subject, body):
    smtp_server = "あなたの情報"
    port = 587
    sender_email = "あなたの情報"
    receiver_email = "あなたの情報"
    password = "あなたの情報"

    message = MIMEText(body)
    message["Subject"] = subject
    message["From"] = sender_email
    message["To"] = receiver_email

    try:
        with smtplib.SMTP(smtp_server, port) as server:
            server.ehlo()
            server.starttls()
            server.login(sender_email, password)
            server.send_message(message)
        print("メールが正常に送信されました")
    except Exception as e:
        print(f"メール送信中にエラーが発生しました: {e}")

def main():
    urls = load_urls()

    for url, last_content in urls.items():
        updated, new_content = check_updates(url, last_content)

        if updated:
            subject = f"更新があります: {url}"
            body = f"ウェブサイト {url} が更新されました。"
            send_email(subject, body)

            urls[url] = new_content

    with open('urls.yaml', 'w') as file:
        yaml.dump(urls, file)

if __name__ == "__main__":
    main()

4. 設定ファイルの作成

プログラムが動作するためには、URLとその最後のコンテンツを保存するための設定ファイル urls.yaml が必要です。このファイルを以下の内容で作成し、プログラムと同じディレクトリに保存してください。

ここでは、監視したいWebページのURLをキーとして、最初は空の値を設定します。プログラムが初めて実行されると、これらのURLの現在のコンテンツが保存され、次回以降の実行時に更新をチェックします。

5. 活用事例

このプログラムは、特定のWebサイトの更新を自動でチェックし、更新があった場合にメールで通知するために使用できます。例えば、ニュースサイトやブログの更新通知、企業の公式発表ページの監視などに活用できます。

このように、Pythonを使用してWebページの更新を自動でチェックし、メールで通知するプログラムを構築することで、手動でのチェック作業を省力化できます。是非お試しください。

タイトルとURLをコピーしました