作者:翻滾吧羊寶寶
本文轉自公眾號 數據森麟
轉戰Python半年,接觸爬蟲2個月,期間讀了10本相關書籍,完成此作,算是對過去學習、實踐的一次回顧。也希望與更多的python,爬蟲愛好者小夥伴們一起交流、成長。
選此題目,一來豆瓣作為爬蟲入門,各種大牛的深入分析已趨於完美;另一方面隨著中國電影工業的發展,我們需要將視角轉向國際市場,通過數據分析,了解一下外國人比較感興趣的電影。
・IMDB top250主頁
・IMDB電影詳情頁(1)
・IMDB 電影詳情頁(2)
基於以上網頁構造,我們發現只需得到每個電影的詳情頁編碼(唯一),通過2次「蛙跳」,實現詳情頁(1)(2)導出國家&類型,分數&人數的信息的獲取。便於理解,爬取思維導圖如下:
#導入庫---
from urllib import request
from chardet import detect
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
#獲取網頁源碼,生成soup對象
def getSoup(url):
with request.urlopen(url) as fp:
byt = fp.read()
det = detect(byt)
time.sleep(random.randrange(1,5))
return BeautifulSoup(byt.decode(det['encoding']),'lxml')
#解析數據---
def getData(soup):
#獲取評分
ol = soup.find('tbody', attrs = {'class': 'lister-list'})
score_info = ol.find_all('td',attrs={'class':'imdbRating'})
film_scores = [k.text.replace('\n','') for k in score_info]
#獲取評分、電影名、導演・演員、上映年份、詳情網頁連結
film_info = ol.find_all('td',attrs={'class':'titleColumn'})
film_names = [k.find('a').text for k in film_info]
film_actors = [k.find('a').attrs['title'] for k in film_info]
film_years = [k.find('span').text[1:5] for k in film_info]
next_nurl = [url2 + k.find('a').attrs['href'][0:17] for k in film_info]
data=pd.DataFrame({'name':film_names,'year':film_years,'score':film_scores,'actors':film_actors,'newurl':next_nurl})
return data
#獲取詳情頁數據---
def nextUrl(detail,detail1):
#獲取電影國家
detail_list = detail.find('div',attrs={'id':'titleDetails'}).find_all('div',attrs={'class':'txt-block'})
detail_str = [k.text.replace('\n','') for k in detail_list]
detail_str = [k for k in detail_str if k.find(':')>=0]
detail_dict = {k.split(':')[0] : k.split(':')[1] for k in detail_str}
country = detail_dict['Country']
#獲取電影類型
detail_list1 = detail.find('div',attrs={'class':'title_wrapper'}).find_all('div',attrs={'class':'subtext'})
detail_str1 = [k.find('a').text for k in detail_list1]
movie_type=pd.DataFrame({'Type':detail_str1})
#獲取以組劃分的電影詳細評分、人數
div_list = detail1.find_all('td',attrs= {'align': 'center'})
value = [k.find('div',attrs= {'class': 'bigcell'}).text.strip() for k in div_list]
num = [k.find('div', attrs={'class': 'smallcell'}).text.strip() for k in div_list]
scores=pd.DataFrame({'value':value,'num':num})
return country,movie_type,scores
最終我們得到了如下數據,並將其進行存儲用於後續的分析:
首先來看一下各個類型的影片佔比:
Top250電影的類型佔比,前三名分別是喜劇、犯罪與動作。
緊張刺激的情緒、張弛有度的情節,最能帶給影迷帶來記憶深刻的觀影體驗。
下面再來看下各個類型的影片的得分對比:
從類型來看,西部片一騎絕塵,究其原因可能與受眾人群小、愛好者狂野奔的性格易給高分有關。其次,犯罪、動作、冒險、推理、恐怖題材也易出較高評分
首先我們看下TOP250電影的所屬年份:
Top250電影中,1957、1995、與2014年電影較多,而1975年後,上榜電影有明顯增加的趨勢,這可能與電影工業的日趨成熟有關。
至於1995年,熟悉電影的小夥伴可能知道,1995年是世界電影100周年,無數電影天才抱著獻禮的想法,在這一年誕生了他們偉大的作品,我們較為熟悉的有《肖申克救贖》、《阿甘正傳》、《低俗小說》、《四個婚禮與一個葬禮》、《七宗罪》、《獅子王》等。
同時我們看下各個年份電影的評價分數:
比較電影年代評分,並無發現明顯上升或下降趨勢,可見電影藝術並不會隨時間而失去自身價值。對於電影,技術不是第一位的,感情共鳴的因素佔更大權重;哪部電影最好看?答案就在我們每個人心中。
我們看下各個國家的電影在TOP250電影中的佔比情況:
這個數據比較有趣,有點像諾貝爾獎,美國電影佔據半壁江山,其餘國家瓜分剩下的蛋糕。排名前幾位的分別是英國、法國、日本、德國。而中國,唯一上榜的電影只有一部——《花樣年華》。
如果是西方主流價值觀的原因,同樣作為東方文化代表的鄰國日本,卻有16部電影上榜,可見西方價值觀並不能成為中國電影上榜少的主要原因。雖然近幾年中國不乏有《大魚海棠》、以及剛最新上映的《流浪地球》這樣高質量的作品上線,但是在國際市場仍反響平平。我相信電影是有共同語言的,也真的有普世價值觀這樣的東西。如何打造國際化電影工業,給世界人民講故事,是中國電影人接下來需要探索的課題。
我們一起看下那些在TOP250榜單中,最常出現的導演們:
電影界的諾貝爾開獎啦,一起來看看有哪些作者上榜。鑑於大家對外國導演名可能不太熟悉,這裡做了一個導演-代表作做對照表,值得注意的是,雷德利・斯科特、詹姆斯・卡梅隆、大衛・芬奇分別執導了電影《異形1》《異形2》《異形3》,一部《異形》出3個上榜導演,可見其系列影響力,沒看過的小夥伴強烈建議一看,雖然口味可能點重。
首先我們看下不同人群的評分情況:
從性別維度來看,男性比女性給容易給出高分。另一方面,從年齡段側看,無論男女,未成年人員最易給出高分,隨著年齡增加,評分愈加犀(è)利(dú),超過45歲的人群,給出的分數是最低的。是否歷經滄海,堅硬的心就越難被打動?又或許見多識廣,才能公正客觀的評價一部電影?也許可以就此問題研究一下,如《電影節評委年齡層的科學配置方法》。
然而知道了評分情況,我們也需要去了解下各類人群的佔比情況:
雖然「老叔叔」、」老阿姨」們的評分偏低,但是一部電影的口碑高低不用太擔心這類人群。因為數據告訴我們,滿足30-44以及18-29這兩個年齡段的中青年男性口味,電影口碑肯定差不了。從近些年《戰狼》、《紅海行動》,這類戰爭動作片均取得不錯的口碑中,對評分機制可略知一二。
首先我們用熱力圖來看下各個人群對不同類型電影的評分情況:
不同年齡群,對電影類型的偏好是不同的。如未成年男性、女性,對推理、西部片表現出濃厚興趣,而45以上的男性、女性,分別對科幻、黑色電影類型鍾愛。
評分的高低也需要結合佔比進行綜合分析:
這次我們將數據粒度細化至各年齡層,結合各年齡段評分,以下我們給出各年齡層在TOP250榜中的推薦電影。
以上是根據IMDBtop250數據推薦的電影,如果有不符合的情況,在這裡說聲抱歉。畢竟美國人民的喜好和中國還是有一定區別的。
最後,用《三體》的一首詩作為結尾:
我看到了我的愛戀
我飛到她的身邊
我捧出給她的禮物
那是一小塊凝固的時間
時間上有美麗的條紋
摸起來像淺海的泥一樣柔軟
她把時間塗滿全身
然後拉起我飛向存在的邊緣
這是靈態的飛行
我們眼中的星星像幽靈
星星眼中的我們也像幽靈
公眾號後臺回復「電影」,可以獲取本文原始碼。