【Webマーケティング】競合サイト調査ツール サンプルコード
こんな悩みを抱えている人に向けて、Pythonで作れる自動化ツールを解説しています。
Webマーケティングのツールについて、こちらの記事で紹介しています。
⇒【Webマーケティング】Pythonで作れる自動化ツールの具体例アイデア11選【業務効率化】
本記事では、競合サイト調査ツールのサンプルコードを公開しています。
サンプルコードは、自分で作成するのが難しい方や、ツール作成の手間を減らしたい方にお勧めです。ぜひご活用ください。
アイデア「競合サイト調査ツール」
概要
指定した競合サイトの変更点を調査し、更新があった場合に内容を記録する。
導入メリット
競合の動向をリアルタイムで把握し、マーケティング戦略の調整を迅速に行えます。
ツール機能
競合サイトの特定のセクションや全体のHTMLコードをチェックし、前回との差分がある場合に記録を残します。
必要技術
requests:WebサイトのHTMLを取得する
BeautifulSoup:HTMLから特定の情報を抽出する
difflib:HTMLの差分を検出する
処理フロー
調査対象サイトのURLのリストが書かれたテキストファイルを読み込む
調査対象サイトサイトのHTMLコードを取得
前回のHTMLがあれば、取得したHTMLを比較し、差分があるかチェック
差分が検出された場合、差分の内容をレポートとして保存
取得したHTMLを保存
前回のHTMLがなければ、HTMLを保存
注意事項
著作権について
本ソースコードの著作権は、販売者に帰属します。
修正や改変は自由に行えますが、無断での複製、配布は法律で禁止されています。
ライセンスについて
本ソースコードは、個人利用及び商用利用が可能です。ただし、再販売や、本ソースコードを基にした派生作品の販売は禁止します。
返金について
デジタルコンテンツの性質上、購入後の返品や返金は原則として受け付けておりません。
使用上の免責事項
本ソースコードは予告なく変更や修正を行う場合があります。
本ソースコードの動作を保証するものではありません。
本ソースコードの使用から生じたいかなる直接的または間接的な損害に対しても、販売者は責任を負いません。
動作の不具合については、購入者自身の責任で対処してください。
サポートについて
本ソースコードに関するサポートは行っておりません。バグ報告や質問への対応は致しかねます。
事前準備
テキストファイル「urls.text」を作成してください。
ファイル内に、調査するサイトのURLを記入してください。
URLを複数記入する場合は、1行に1つのURLとしてください。
ソースコード
import os
import requests
import difflib
import datetime
from bs4 import BeautifulSoup
# URLリストのファイルパス
URL_LIST_FILE = 'urls.txt'
# HTML保存ディレクトリ
HTML_DIR = 'html_files'
# レポート保存ディレクトリ
REPORT_DIR = 'reports'
# ログファイルパス
LOG_FILE = 'monitor_log.txt'
# ディレクトリの有無確認と作成
os.makedirs(HTML_DIR, exist_ok=True)
os.makedirs(REPORT_DIR, exist_ok=True)
def read_url_list(file_path):
"""URLリストを読み込む"""
with open(file_path, 'r') as file:
urls = [line.strip() for line in file]
return urls
def fetch_html(url):
"""URLからHTMLを取得する"""
response = requests.get(url)
response.raise_for_status()
return response.text
def save_html(content, filename):
"""HTMLをファイルに保存する"""
with open(filename, 'w', encoding='utf-8') as file:
file.write(content)
def load_html(filename):
"""ファイルからHTMLを読み込む"""
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as file:
return file.read()
return None
def extract_text(html):
"""HTMLからタグ以外のテキストを抽出し、改行を残す"""
soup = BeautifulSoup(html, 'html.parser')
text = soup.get_text()
# 空白を削除して改行を残す
lines = [line.strip() for line in text.splitlines()]
return '\n'.join(lines)
def normalize_text(text):
"""テキストから改行や空白を除去する"""
return ''.join(text.split())
def get_diff_html(old_content, new_content):
"""HTMLの差分を取得し、HTML形式で出力"""
old_lines = [line.strip() for line in old_content.splitlines()]
new_lines = [line.strip() for line in new_content.splitlines()]
diff = difflib.HtmlDiff(wrapcolumn=80).make_file(
old_lines,
new_lines,
fromdesc='前回のバージョン',
todesc='現在のバージョン',
context=True,
numlines=2
)
return diff
def log_message(message):
"""ログメッセージを記録する"""
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
with open(LOG_FILE, 'a', encoding='utf-8') as log_file:
log_file.write(f"{timestamp} - {message}\n")
def main():
urls = read_url_list(URL_LIST_FILE)
for url in urls:
# URLに対応するファイル名を生成
filename = os.path.join(HTML_DIR, f"{url.replace('http://', '').replace('https://', '').replace('/', '_')}.html")
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
report_filename = os.path.join(REPORT_DIR, f"{url.replace('http://', '').replace('https://', '').replace('/', '_')}_report_{timestamp}.html")
try:
new_html = fetch_html(url)
old_html = load_html(filename)
if old_html is not None:
old_text = extract_text(old_html)
new_text = extract_text(new_html)
normalized_old_text = normalize_text(old_text)
normalized_new_text = normalize_text(new_text)
if normalized_old_text != normalized_new_text:
diff_html = get_diff_html(old_text, new_text)
with open(report_filename, 'w', encoding='utf-8') as report_file:
report_file.write(diff_html)
print(f"更新が検出されました: {url}")
log_message(f"更新が検出されました: {url}")
else:
print(f"変更なし: {url}")
log_message(f"変更なし: {url}")
else:
print(f"初回取得: {url}")
log_message(f"初回取得: {url}")
# 新しいHTMLを保存
save_html(new_html, filename)
except Exception as e:
error_message = f"エラーが発生しました: {url} - {e}"
print(error_message)
log_message(error_message)
if __name__ == "__main__":
main()
最後まで読んでいただき、ありがとうございました!
参考のなったと思っていただけたら、
♡スキを押していただけると嬉しいです。
今後もサンプルコードを紹介する予定なので、
関心のある方は是非アカウントのフォローをお願いします!
この記事が気に入ったらサポートをしてみませんか?