このプログラムをターミナルで起動させると、検索ワードを入力、調べる日数(過去1〜7日間)を選択して、保存するグラフに時間を記入するかを選択し、グラフを作成します。
1. 必要なインストール
まず、Webスクレイピングを行うために必要なライブラリとツールをインストールする必要があります。以下のコマンドをターミナルで実行してください。
pip install selenium pandas matplotlib webdriver-manager
また、ChromeDriverも必要です。webdriver-manager
を使用して自動的にインストールされます。
2. 各プログラムの説明
各プログラムの部分ごとに説明をします。
ライブラリ等のインポート
まず、必要なライブラリをインポートします。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import re
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import urllib.parse
ユーザー入力
ユーザーに検索クエリと日数、時間表示のオプションを入力してもらいます。
query = input("検索名を入力してください: ")
days = int(input("検索する日数を入力してください(1-7): "))
show_time = input("時間を表示しますか? (y/n): ").lower() == 'y'
クエリ設定とWebDriverの設定
検索クエリをURLにエンコードし、ChromeのWebDriverを設定します。
query_encoded = urllib.parse.quote(query)
url = f"https://search.yahoo.co.jp/realtime/search?p={query_encoded}&gm=w"
options = Options()
options.add_argument("--headless")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(url)
要素の取得とツイート数の計算
指定した要素が表示されるまで待機し、ツイート数とツイートの推移を取得します。
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@id='graph']/div/div[3]/div[2]/p/span[1]")))
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".recharts-curve.recharts-area-curve")))
tweet_count = driver.find_element(by=By.XPATH, value="//*[@id='graph']/div/div[3]/div[2]/p/span[1]").text
tweet_count = int(tweet_count.replace(",", ""))
print("最大値: " + str(tweet_count))
ツイート推移のデータ処理
取得したツイート推移のデータを処理し、時間インデックスを作成します。
time_text = driver.find_element(by=By.CSS_SELECTOR, value=".recharts-curve.recharts-area-curve")
d_element = time_text.get_attribute("d")
modified_string = re.sub(r"[a-zA-Z]", ",", d_element)[1:]
values = modified_string.split(",")[1::6][1:-1]
values = [160 - float(x) for x in values]
max_value = max(values)
values = [round((x / max_value) * tweet_count) for x in values]
now = datetime.now()
start_time = now - timedelta(days=days, hours=-2, minutes=now.minute, seconds=now.second, microseconds=now.microsecond)
hourly_list = [start_time + timedelta(hours=i) for i in range(24 * days - 1)]
s = pd.Series(values[-24*days+1:], index=hourly_list)
total_tweets = s.sum()
グラフの作成と保存
ツイート数の推移をグラフ化し、画像ファイルとして保存します。
plt.figure(figsize=(12, 6))
s.plot(kind='bar')
plt.title(f'Tweet Count Over Time for "{query}"')
plt.xlabel('Date')
plt.ylabel('Tweet Count')
if show_time:
plt.xticks(range(0, len(s), 4), [d.strftime('%m/%d %H:%M') for d in s.index[::4]], rotation=45, ha='right')
else:
plt.xticks(range(0, len(s), 24), [d.strftime('%m/%d') for d in s.index[::24]], rotation=45, ha='right')
plt.text(0.95, 0.95, f'Total Tweets: {total_tweets:,}',
verticalalignment='top', horizontalalignment='right',
transform=plt.gca().transAxes,
fontsize=10, bbox=dict(facecolor='white', alpha=0.8))
plt.tight_layout()
file_name = f"{query}_{now.strftime('%Y%m%d')}.png"
plt.savefig(file_name)
driver.quit()
print(f"グラフが保存されました: {file_name}")
3. 全体のプログラム
以上のコードをまとめた全体のプログラムは以下の通りです。
# ライブラリ等のインポート
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import re
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import urllib.parse
# ユーザー入力
query = input("検索名を入力してください: ")
days = int(input("検索する日数を入力してください(1-7): "))
show_time = input("時間を表示しますか? (y/n): ").lower() == 'y'
# クエリを設定
query_encoded = urllib.parse.quote(query)
url = f"https://search.yahoo.co.jp/realtime/search?p={query_encoded}&gm=w"
# WebDriverの設定
options = Options()
options.add_argument("--headless")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.get(url)
# 要素が表示されるまで待機
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@id='graph']/div/div[3]/div[2]/p/span[1]")))
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".recharts-curve.recharts-area-curve")))
# ツイート数の取得
tweet_count = driver.find_element(by=By.XPATH, value="//*[@id='graph']/div/div[3]/div[2]/p/span[1]").text
tweet_count = int(tweet_count.replace(",", ""))
print("最大値: "+str(tweet_count))
# ツイート推移の取得
time_text = driver.find_element(by=By.CSS_SELECTOR, value=".recharts-curve.recharts-area-curve")
d_element = time_text.get_attribute("d")
modified_string = re.sub(r"[a-zA-Z]", ",", d_element)[1:]
values = modified_string.split(",")[1::6][1:-1]
values = [160 - float(x) for x in values]
max_value = max(values)
# ツイート推移のデータを計算
values = [round((x / max_value) * tweet_count) for x in values]
# 時間インデックスの取得
now = datetime.now()
start_time = now - timedelta(days=days, hours=-2, minutes=now.minute, seconds=now.second, microseconds=now.microsecond)
hourly_list = [start_time + timedelta(hours=i) for i in range(24 * days - 1)]
# ... (前の部分は同じ)
# 結果の表示
s = pd.Series(values[-24*days+1:], index=hourly_list)
# 合計ツイート数の計算
total_tweets = s.sum()
# グラフの保存
plt.figure(figsize=(12, 6))
s.plot(kind='bar')
plt.title(f'Tweet Count Over Time for "{query}"')
plt.xlabel('Date')
plt.ylabel('Tweet Count')
# x軸のラベル設定
if show_time:
plt.xticks(range(0, len(s), 4), [d.strftime('%m/%d %H:%M') for d in s.index[::4]], rotation=45, ha='right')
else:
plt.xticks(range(0, len(s), 24), [d.strftime('%m/%d') for d in s.index[::24]], rotation=45, ha='right')
# 合計ツイート数をグラフ内に追加
plt.text(0.95, 0.95, f'Total Tweets: {total_tweets:,}',
verticalalignment='top', horizontalalignment='right',
transform=plt.gca().transAxes,
fontsize=10, bbox=dict(facecolor='white', alpha=0.8))
plt.tight_layout()
# ファイル名の作成と保存
file_name = f"{query}_{now.strftime('%Y%m%d')}.png"
plt.savefig(file_name)
# WebDriverを終了
driver.quit()
print(f"グラフが保存されました: {file
_name}")
4. WEBスクレイピングの注意事項
- ウェブサイトの利用規約を守る: スクレイピングを行う前に、対象サイトの利用規約を確認し、それに従うことが重要です。
- 負荷をかけない: サイトに過度な負荷をかけないように、リクエストの間に適切な間隔を置くようにしてください。
- データの正確性: スクレイピングしたデータが正確であることを確認し、必要に応じてデータのクレンジングを行います。
5. 活用事例
このスクレイピングプログラムは、特定のキーワードに関するツイート数の推移を視覚化するために使用できます。たとえば、以下のような用途があります。
- マーケティング分析: 商品やキャンペーンの反響をリアルタイムで把握し、戦略の改善に役立てる。
- トレンド分析: 特定のトピックやイベントに関する世間の関心度を分析し、将来の予測や対応策を考える。
- リサーチ: 学術研究やジャーナリズムにおいて、特定の話題に関する公開データを収集し、分析に利用する。