Pythonで映画レビューをスクレイピング

IT

2025-02-23

ネット上にサンプルがあるけれど、映画レビューサイトのつくりが変わってしまったのかうまく動かないようなので、自分でいちから作ってみた。Pythonはバージョン3.13。


from selenium import webdriver
from selenium.webdriver.common.by import By #Byクラスによる抽出
from selenium.webdriver.chrome.options import Options
import pandas as pd

options = Options()
options.add_argument('--headless')

#ブラウザの起動
service = webdriver.ChromeService()
#Selenium v4.11以降はドライバーのディレクトリを指定する必要はない
driver = webdriver.Chrome(service=service,options=options)
#ヘッドレスモードで起動する
url = "https://eiga.com/movie/103041/review/"
driver.get(url)

#レビューを格納するリスト
reviews = []

i = 0
is_continue = True
while(is_continue):
i = i + 1

#レビューの抽出
elements = driver.find_elements(By.CLASS_NAME,
"user-review-inner")
#ページ内の複数のレビューを抽出
#while文の中で新しい要素を取得し続けないと
'stale element not found'のエラーが出る


for e in elements:
review = [] #投稿者一人分のリスト

#タイトルの取得
title_e = e.find_element(By.CLASS_NAME,
"review-title")
title = title_e.find_element(By.CSS_SELECTOR,
"a").get_attribute("textContent")
#要素内の文字列を取得
print(title)
review.append(title)

#レビュー本文の取得
text = e.find_element(By.CLASS_NAME,
"txt-block").get_attribute("textContent")
#要素内の文字列を取得
(hiddenクラスで記述されたネタバレも取得できる)

text = text.replace("ネタバレ! クリックして本文を読む","")
.replace("\n","")
#不要な文字列と改行コードを削除
print(text)
review.append(text)

reviews.append(review)

if i > 3: #ページ数の上限(i>3なら4ページまで取得)
break

#最後のページまで来たら終了
if driver.find_elements(By.CSS_SELECTOR,
".next.icon-after.disabled"):
break

#次のページがあればクリックして作業を続ける
next_button = driver.find_element(By.CSS_SELECTOR,
".next.icon-after")
#複数classはドットをつける。CSS_SELECTORで取得
driver.execute_script("arguments[0].click();",
next_button)
# JavaScriptでクリックさせる。
これだと画面上になくてもクリックできる。



df = pd.DataFrame(reviews, columns=['タイトル','レビュー'])
df.index.name = '番号'
df.to_csv(
"機動戦士Gundam GQuuuuuuX Beginningのレビュー・感想・評価.csv",
encoding="utf-8_sig")
#デフォルトだとworkspaceに保存する
#encodingをshift-jisにすると、エンコードできない文字がある


input()


#で解説もつけてますが、読む方はあくまで自己責任で。参考程度にとどめてね。

Pythonはやっぱり簡単ですね。個人的にはC#が好きだったけど、これからはスクレイピングもPythonなのか… エディタもVisual Studio Codeだと軽量で扱いやすい。

苦労したのは「次ページ」ボタンをいかにクリックするか。スクレイピングではこれに割と引っ掛かりやすいらしいが、方法は様々。time.sleep()を使ったりdriver.execute_scriptでスクロールさせる手段もあるが、driver.execute_scriptで直接クリックするのが今のところ一番シンプルみたい。

映画.comはサイトの構造が比較的シンプルなので、まだ作りやすい。それに1ページに20人分のレビューがあるので、一気に大量に取得できる。