このサイトを参考にしながら、Web scraping (ウェブスクレイピング)について学んでみる。ウェブスクレイピングとは、ウェブサイトから必要な情報を抽出することで、データサイエンスには必須の技術のようであるが、法的にスクレイピングが問題となるサイトもあるらしいので注意が必要だ。
BeautifulSoupでIMDBデータを抽出¶
IMDBサイトから必要な映画データをBeautifulSoupを使って抽出する。テストケースとして最初のページから映画タイトル、公開年、IMDBスコア、メタデータスコア、投票数、興行収入等を抽出する。先ずは、ウェブサイトをダウンロードする。
from requests import get
url = 'https://www.imdb.com/search/title/?release_date=2018-01-01,2018-12-31&sort=num_votes,desc&start=1&ref_=adv_nxt'
response = get(url)
BeautifulSoupを使って必要なデータを抽出する。
from bs4 import BeautifulSoup
html_soup = BeautifulSoup(response.text, 'html.parser')
content = html_soup.find_all('div', class_ = 'lister-item mode-advanced')
import re
import numpy as np
movieTitle = []
movieDate = []
movieRunTime = []
movieGenre = []
movieRating = []
movieScore = []
movieDescription = []
movieDirector = []
movieStars = []
movieVotes = []
movieGross = []
for movie in content:
movieFirstLine = movie.find("h3", class_="lister-item-header")
movieTitle.append(movieFirstLine.find("a").text)
movieDate.append(re.sub(r"[()]","", movieFirstLine.find_all("span")[-1].text))
try:
movieRunTime.append(movie.find("span", class_="runtime").text[:-4])
except:
movieRunTime.append(np.nan)
movieGenre.append(movie.find("span", class_="genre").text.rstrip().replace("\n","").split(","))
try:
movieRating.append(movie.find("strong").text)
except:
movieRating.append(np.nan)
try:
movieScore.append(movie.find("span", class_="metascore").text.rstrip())
except:
movieScore.append(np.nan)
movieDescription.append(movie.find_all("p", class_="text-muted")[-1].text.lstrip())
movieCast = movie.find("p", class_="")
try:
casts = movieCast.text.replace("\n","").split('|')
casts = [x.strip() for x in casts]
casts = [casts[i].replace(j, "") for i,j in enumerate(["Director:", "Stars:"])]
movieDirector.append(casts[0])
movieStars.append([x.strip() for x in casts[1].split(",")])
except:
casts = movieCast.text.replace("\n","").strip()
movieDirector.append(np.nan)
movieStars.append([x.strip() for x in casts.split(",")])
movieNumbers = movie.find_all("span", attrs={"name": "nv"})
if len(movieNumbers) == 2:
movieVotes.append(movieNumbers[0].text)
movieGross.append(movieNumbers[1].text)
elif len(movieNumbers) == 1:
movieVotes.append(movieNumbers[0].text)
movieGross.append(np.nan)
else:
movieVotes.append(np.nan)
movieGross.append(np.nan)
movieData = [movieTitle, movieDate, movieRunTime, movieGenre, movieRating, movieScore, movieDescription,
movieDirector, movieStars, movieVotes, movieGross]
import pandas as pd
df = pd.DataFrame(movieData).T
df.tail()
df.columns = ['タイトル','公開年','上映時間','ジャンル','IMDBスコア','メタスコア',\
'あらすじ','監督','出演者','投票数','興行収入']
df.head()
df.sort_values(by='IMDBスコア',ascending=False).head(10)
トップの「The Haunting of Hill House」のあらすじを見てみる。
df['あらすじ'][27]
あらすじは、「過去と現在の狭間に揺れる家族が、彼等のかつての家と彼等をそこから追い遣った惨劇の忌まわしい記憶に直面する。」といったもので、このドラマは、ネットフリックスのオリジナルのようである。日本では「ザ・ホーンティング・オブ・ヒルハウス」と呼ばれている。
次にメタスコアが高い順に並び替える。
df.sort_values(by='メタスコア',ascending=False).head(10)
トップの「Roma」のあらすじを見てみる。
df['あらすじ'][31]
あらすじは、「1970年代前半、メキシコシティーにおける中流家庭のメイドの生活の一年を綴る」となっている。これもNetflixオリジナルのようである。評論家達の評価は非情に高い一方で、一般視聴者の評価はまちまちである。Netflixと言えば、オバマ初のドキュメンタリーである「American Factory」が巷で話題になっている。