難しいことも多いですが新しいことを学び、作ったプログラムがうまく起動すると楽しいですね。
本記事では、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
が必要です。このファイルを以下の内容で作成し、プログラムと同じディレクトリに保存してください。
https://example.com: ""
https://another-example.com: ""
ここでは、監視したいWebページのURLをキーとして、最初は空の値を設定します。プログラムが初めて実行されると、これらのURLの現在のコンテンツが保存され、次回以降の実行時に更新をチェックします。
5. 活用事例
このプログラムは、特定のWebサイトの更新を自動でチェックし、更新があった場合にメールで通知するために使用できます。例えば、ニュースサイトやブログの更新通知、企業の公式発表ページの監視などに活用できます。
このように、Pythonを使用してWebページの更新を自動でチェックし、メールで通知するプログラムを構築することで、手動でのチェック作業を省力化できます。是非お試しください。