PR

PythonでYahoo!リアルタイム検索をターミナルで入力してツイート数のデータを取得する方法

このプログラムをターミナルで起動させると、検索ワードを入力調べる日数(過去1〜7日間)を選択して、保存するグラフに時間を記入するかを選択し、グラフを作成します。

PythonでYahoo!リアルタイム検索をターミナルで入力してツイート数のデータを取得する方法

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スクレイピングの注意事項

PythonでYahoo!リアルタイム検索をターミナルで入力してツイート数のデータを取得する方法2
  • ウェブサイトの利用規約を守る: スクレイピングを行う前に、対象サイトの利用規約を確認し、それに従うことが重要です。
  • 負荷をかけない: サイトに過度な負荷をかけないように、リクエストの間に適切な間隔を置くようにしてください。
  • データの正確性: スクレイピングしたデータが正確であることを確認し、必要に応じてデータのクレンジングを行います。

5. 活用事例

このスクレイピングプログラムは、特定のキーワードに関するツイート数の推移を視覚化するために使用できます。たとえば、以下のような用途があります。

  • マーケティング分析: 商品やキャンペーンの反響をリアルタイムで把握し、戦略の改善に役立てる。
  • トレンド分析: 特定のトピックやイベントに関する世間の関心度を分析し、将来の予測や対応策を考える。
  • リサーチ: 学術研究やジャーナリズムにおいて、特定の話題に関する公開データを収集し、分析に利用する。
タイトルとURLをコピーしました