豆瓣已玩爛,這次我們爬取了IMDB電影Top250後發現...(附原始碼)

2021-02-25 CDA數據分析師

作者:翻滾吧羊寶寶

本文轉自公眾號 數據森麟

轉戰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數據推薦的電影,如果有不符合的情況,在這裡說聲抱歉。畢竟美國人民的喜好和中國還是有一定區別的。

 

最後,用《三體》的一首詩作為結尾:

我看到了我的愛戀

我飛到她的身邊

我捧出給她的禮物

那是一小塊凝固的時間

時間上有美麗的條紋

摸起來像淺海的泥一樣柔軟

 

她把時間塗滿全身

然後拉起我飛向存在的邊緣

這是靈態的飛行

我們眼中的星星像幽靈

星星眼中的我們也像幽靈

公眾號後臺回復「電影」,可以獲取本文原始碼。

相關焦點

  • Python3爬蟲之豆瓣電影TOP250(requests、Xpath、正則表達式、CSV、二進位數據儲存)
    【1x00】循環爬取網頁模塊觀察豆瓣電影 Top 250,請求地址為:https://movie.douban.com/top250每頁展示25條電影信息,照例翻頁觀察 url 的變化:第一頁:https://movie.douban.com/top250第二頁:https://movie.douban.com/top250
  • Python爬蟲經典案例詳解:爬取豆瓣電影top250寫入Excel表格
    soup = BeautifulSoup(html.text, 'html.parser')這句代碼就是說用html解析器(parser)來分析我們requests得到的html文字內容,soup就是我們解析出來的結果。For循環豆瓣頁面上有25部電影,而我們需要抓取每部電影的標題、導演、年份等等信息。就是說我們要循環25次,操作每一部電影。
  • 爬取豆瓣短評,劉若英導演的電影《後來的我們》發現愛情原來是這樣
    電影能否跟歌曲一樣深入人心,懷著這樣的一種心情,我們一起來分析一下它的影評吧。要點:用selenium 爬取數據數據清洗並存入Mongodb用echart可視化分析用jieba分詞用WordCloud做雲圖通過試探知道:豆瓣影評設置權限,沒有登陸的話,只能夠看到前面的幾十條短評,並且登錄的時候需要輸入驗證碼。
  • python爬蟲—豆瓣電影top250及數據可視化!
    豆瓣電影top250榜單想必大家都不陌生,上榜的電影都是經過時間的沉澱留下來比較經典。本次教程就是利用requests庫實現對於top250榜單電影數據爬取,並對爬取的數據繪製圖表進行可視化,做簡單的數據分析。文章將分為兩個部分:top250數據爬蟲和數據可視化。
  • 第53天,我找到Python代碼錯誤,終於成功爬取了豆瓣電影top250
    上次說對照代碼,死活找不到程序運行的錯誤,可謂百思不得其姐。老辦法,問度娘。關於錯誤「IndexError: list index out of range」,一般是兩種可能:第一種是 index 超出範圍;第二種是 list 是一個空的,沒有一個元素。很明顯,我這錯誤屬於第一種。
  • Python爬取某個18禁網站的電影資源
    最近在想著爬一些有趣的網站,豆瓣淘寶京東,這些網站大多都被爬爛了,然後就想著爬點簡單點的,例如某色網站啥的是吧,男生一般都會有幾個自己知道的網站
  • 不用Python,Excel輕鬆抓取豆瓣TOP250
    之前寫了篇Python批量爬取網頁數據的文章,後來發現Excel隨著版本的迭代,已經完全支持多頁面抓取數據了,不用擼代碼,點點滑鼠就能抓取數據,讓我們一起看看吧~網頁解析在抓取數據之前,先對網頁進行一下解析,下圖中是豆瓣TOP250初始頁面,拉到最底部可以發現一共有10個頁面,每個頁面25部電影,一共250部電影。
  • 一次性看完【豆瓣電影Top250】
    一部電影或電視劇好不好看,豆瓣評分是個重要的指標。而一部豆瓣評分8分以上的電影,就一定不會太差。
  • 多種方法爬取貓眼電影並分析(附代碼)
    想深入了解一些比較有意思的信息,比如:哪部電影的評分最高?哪位演員的作品數量最多?哪個國家/地區上榜的電影數量最多?哪一年上榜的電影作品最多等。offset=0'3    html = get_one_page(url)4    print(html)567if __name__ == '__main__':8    main()運行上述程序後,首頁的原始碼就被爬取下來了。如下圖所示:
  • python爬取44130條用戶觀影數據,分析挖掘用戶與電影之間的隱藏信息!
    明天就是大年初一,很多電影也上映,看電影前很多人都喜歡去『豆瓣』看影評,所以我爬取44130條『豆瓣』的用戶觀影數據,分析用戶之間的關係,電影之間的聯繫,以及用戶和電影之間在『豆瓣』平臺爬取用戶觀影數據。爬取用戶列表網頁分析
  • 上映26年後,周星馳的《九品芝麻官》終於進入「豆瓣電影top250」
    《九品芝麻官》登上豆瓣top250,經歷了整整26年而今天要跟大家說的這部電影,也是周星馳眾多作品裡最被低估的存在。可是經過26年之後,終於在今年強勢殺入豆瓣top250榜單,它就是《九品芝麻官》。這部影片的內容,其實不用小編過多的介紹,喜歡周星馳電影的小夥伴們一定是看過這部電影的。
  • python爬蟲實戰:爬取全站小說排行榜
    我們本文就爬取這個網站的上千本小說。重點在和大家一起分享一些爬蟲的思路和一些很常遇到的坑。我們現在得到了網站的response,接下來就是對我們想要獲取的數據進行解析、提取,但等等,考慮到我們要爬取大量小說,不搞一個資料庫存儲真是太失敗了,作者推薦MongoDB資料庫,屬於NOSQL類型資料庫,以文檔存儲為主,這裡用來爬小說真是太適合不過了。
  • 豆瓣Top250熱門電影數據分析
    豆瓣Top250熱門電影分析業餘打發時間看電影是個不錯的選擇,但是如果看了一部無聊糟心的電影就得不償失了,所以一些電影方面的榜單就出現了,可以為這些選擇困難患者提供一個不錯的指南,那些是經典是值得看的,而那些電影不值得你浪費一兩個小時的時間。
  • 使用requests+正則表達式爬取貓眼電影排行
    獲取原始碼後,就需要解析頁面,提取出我們想要的信息。5. 正則提取接下來,回到網頁看一下頁面的真實源碼。在開發者模式下的Network監聽組件中查看原始碼,如下圖所示。分頁爬取因為我們需要抓取的是TOP100的電影,所以還需要遍歷一下,給這個連結傳入offset參數,實現其他90部電影的爬取,此時添加如下調用即可:if __name__ == '__main__':    for i in range(10):        main(offset=i * 10)這裡還需要將main()方法修改一下,接收一個
  • 用Python爬取糗事百科段子,可視化後結果發現
    selenium爬取段子信息這次我們利用selenium來實現翻頁爬取段子信息!browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})def get_data(page):     # 爬取數據函數
  • 爬取電影天堂的最新電影
    主要工作兩個:第一,實例化出一個dytt8Moive對象,然後開始爬取信息。第二,等爬取結束,將數據插入到資料庫中。處理爬蟲的邏輯代碼如下:LASTEST_MOIVE_TOTAL_SUM = 6 THREAD_SUM = 5def startSpider():            LASTEST_MOIVE_TOTAL_SUM = dytt_Lastest.getMaxsize()    print
  • 電影評分哪家強?豆瓣IMDB爛番茄大比拼
    首先表明個態度,我覺得《戰狼2》和《流浪地球》爛到喪心病狂。當越來越多人依賴電影評分來選擇觀影時,評分網站的公正性、準確性就顯得至關重要。在國外,電影評分最權威的無疑是IDMB和爛番茄。但在其對TOP250榜單篩選計算的方式中,我們可以看出其些許端倪,比如「經常投票者其票數才會被計算在內」、「該影片需要的最少票數」、「投票者投票時間的分布」等等。同時,IMDB除了電影分數,還會給出給出根據年齡、國籍、性別等不同情況,所列出的分數表。
  • 豆瓣電影TOP250在線觀看
    豆瓣電影評分是目前國內參與最多也最有影響力的評分,因此豆瓣的高分電影必定不會令大家失望,今天整理了豆瓣的TOP250電影榜單,點擊可直接觀看
  • Python爬蟲獲取豆瓣電影並寫入excel
    這篇文章主要介紹了Python爬蟲獲取豆瓣電影並寫入excel ,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值
  • 電影《我和我的家鄉》到底有多牛?爬取貓眼評論數據,可視化數據
    《我和我的家鄉》在貓眼上目前有 55.5 萬人評分,總體評分 9.3,可以說是一個相當不錯的成績了,本文我們爬取該片的貓眼電影評論,一起分析下這部影片評論區的內容。爬取首先,我們來爬取貓眼電影評論數據,因 PC 端只能看到貓眼上的幾條評論