mai_Nのプログラミング勉強メモ

Python or R × マーケティング

映画レビューサイトから情報をスクレイピング②映画詳細情報

映画ドットコムからいろいろ情報を抽出して分析してみる!
今回は個別の映画の詳細ページから映画詳細情報を取りこんでみる。

まずは必要なライブラリをインポート
import requests
from bs4 import BeautifulSoup
import pandas as pd
映画詳細情報のページの情報をとってくる

今回は事前に用意した映画のIDリストを使ってforループで複数の映画情報をとってこれるようにした。
例えば以下の記事でcsvに出力したデータを使うことができる↓
ma-i.hatenablog.com

DF_movie_list = pd.read_csv("出力したcsvファイル")  #映画のIDをリストとして取得
movie_ids = DF_movie_list["movie_id"] 

data = []
for i in range(len(movie_ids)): #forループをまわす
    movie_id = movie_ids[i]
    movie_url = 'https://eiga.com/movie/' + movie_id + '/'
    soup = BeautifulSoup(requests.get(movie_url).content)
タイトルや概要などの情報を取得する

(上記のforループの中に入れる処理)

 movie_title = soup.find('h1', class_="page-title").text.replace("\u3000", "") #映画タイトル
    date = soup.find('p', class_="date-published").find('strong').text #公開年
    movie_minutes = soup.find('div', class_="movie-details").find_all('p')[1].text.split(":")[0].split("/")[1].replace("分", "") #映画の長さ
    dist_agency = soup.find('div', class_="movie-details").find_all('p')[1].text.split(":")[1] #配給会社
    explanation = soup.find('div', class_="movie-details").find_all('p')[0].text #概要
キャスト情報はulタグでリストを一気に取ってきてから1つ1つ分けた

(上記のforループの中に入れる処理)

    all_casts = soup.find('ul',class_="movie-cast").find_all('span') #リスト部分をごっそり取得
    for i in range(len(all_casts)): 
        all_casts[i] = all_casts[i].text.replace(" ", "").replace(" ", "")
    cast_1 = all_casts[0]  #5人目までは「cast_(数字)」という変数に格納
    cast_2 = all_casts[1]
    cast_3 = all_casts[2]
    cast_4 = all_casts[3]
    cast_5 = all_casts[4]
    cast_others = ", ".join(all_casts[5:]) #6人目以降はまとめて「cast_others」という変数に格納
スタッフ情報はdlタグで一気に取ってきてから1つ1つ分けた

(上記のforループの中に入れる処理)

    all_staffs = soup.find('dl',class_="movie-staff").find_all(['dt', 'dd']) #dlタグの中のdtまたはddタグ部分を取得
    for i in range(len(all_staffs)): 
        all_staffs[i] = all_staffs[i].text.replace(" ", "").replace(" ", "")
  #このリストの中身は「['監督', '山田△夫', '脚本', '田中〇美'...](役職名、個人名、役職名、個人名...)」という状態
    if '監督' in all_staffs:  #
        director = all_staffs[all_staffs.index('監督')+1] #リストの中の"監督"の次の要素を持ってくる
    if '脚本' in all_staffs:
        writer = all_staffs[all_staffs.index('脚本')+1] #リストの中の"脚本"の次の要素を持ってくる
最後に評価情報を取得してからここまで取得した全ての情報を辞書型データにまとめる

(上記のforループの中に入れる処理)

    rating_star = soup.find('span', class_="rating-star").text #評価(星の数)
    review_number = soup.find('span', class_="total-number").text.replace("全", "").replace("件", "") #レビュー数
    checkin_number = soup.find('div', class_="popular-tool").find('span').text.replace("人", "") #チェックイン数
    
    datum = {  #辞書型データにまとめる
        "movie_title":movie_title,
        "date":date,
        "movie_minutes":movie_minutes,
        "dist_agency":dist_agency,
        "explanation":explanation,
        "cast_1":cast_1,
        "cast_2":cast_2,
        "cast_3":cast_3,
        "cast_4":cast_4,
        "cast_5":cast_5,
        "cast_others":cast_others,
        "director":director,
        "writer":writer,
        "rating_star":rating_star,
        "review_number":review_number,
        "checkin_number":checkin_number,
    } 
    
    data.append(datum) #最初に作った空のリストに格納
必要ならcsvに出力

(これはforループの外。最後に。)

csv_filename = "映画詳細情報.csv"
DF_movie_detail = pd.DataFrame(data)
DF_movie_detail.to_csv(csv_filename, encoding="cp932")


↓↓↓↓↓

こんなファイルができた!

f:id:ma__i:20210728055838p:plain