跟著我一起N赶摹!昌跌!教你如何抓取豆瓣高分電影數(shù)據(jù)進(jìn)行信息分析仰禀!

1、數(shù)據(jù)抓取

首先我們要收集數(shù)據(jù)才能進(jìn)行數(shù)據(jù)分析蚕愤。獲取數(shù)據(jù)的主要途徑:現(xiàn)成數(shù)據(jù)答恶、自己用爬蟲爬取得到的數(shù)據(jù);使用現(xiàn)有的爬蟲工具爬取所需內(nèi)容萍诱,保存到數(shù)據(jù)庫悬嗓,或以文件的形式保存到本地。
而我是用python軟件爬取的豆瓣高分電影信息裕坊,用以獲取其中的數(shù)據(jù)包竹。

1.1網(wǎng)頁分析

1.網(wǎng)頁URL地址:https://www.douban.com/doulist/240962/
2.根據(jù)URL在瀏覽器打開網(wǎng)頁的首頁:

在這里插入圖片描述

3.檢查網(wǎng)頁:
右擊選中檢查或按F12,在該窗口中找到存放電影信息的代碼


在這里插入圖片描述

從檢查得到的源代碼可以看到:
class=‘title’的div標(biāo)簽文本中存放著電影名稱
class=‘rating’的div標(biāo)簽中存放著星級籍凝,評分和評價人數(shù)
class=‘a(chǎn)bstract’的div標(biāo)簽中存放著導(dǎo)演周瞎,主演,類型饵蒂,制片國家/地區(qū)和年份的信息

1.2獲取信息

通過網(wǎng)頁分析可知声诸,我們所需要的信息都在HTML頁面里,所以我們只需要獲取HTML頁面相應(yīng)class類div中的信息就可以了
1.獲得網(wǎng)頁所有數(shù)據(jù):

r=requests.get(link,headers=headers,timeout=10)
soup=BeautifulSoup(r.text,"lxml")

2.獲取電影名稱:

div_list=soup.find_all('div',class_='title')
    for each in div_list:
    # 在div中退盯,a標(biāo)簽的text的內(nèi)容就是中文電影名稱
    movie_name=each.a.text.strip() 
    movie_names.append(movie_name)

3.獲取電影評分和評價人數(shù):

for each in soup.find_all('div',class_='rating'):
        #在div中彼乌,第二個span的text內(nèi)容為評分,第三個span的text的內(nèi)容為評價人數(shù)
        a=each.text.split('\n') 
        #獲取字符串中的數(shù)字
        x=''.join(re.findall(r'[0-9]',str(a[3])))
        movie_dis.append(x)
        movie_grade.append(float(a[2]))

4.獲取電影導(dǎo)演渊迁,主演慰照,類型,制片國家/地區(qū)和年份的信息:

for each in soup.find_all('div',class_='abstract'):
        a=each.text
        #.匹配任意字符宫纬,除了換行符
        tp = re.search(r'類型: (.*)',a)
        #對空值和字符進(jìn)行處理
        if tp==None:
            movie_types.append(" ")
        else:
            movie_types.append(tp.group(1))
        actor = re.search(r'主演: (.*)',a)
        if actor==None:
            movie_actor.append(" ")
        else:
            movie_actor.append(actor.group(1))
        director = re.search(r'導(dǎo)演: (.*)',a)
        if director==None:
            movie_director.append(" ")
        else:
            movie_director.append(director.group(1))
        addr = re.search(r'制片國家/地區(qū): (.*)',a)
        if addr==None:
            movie_addr.append(" ")
        else:
            movie_addr.append(addr.group(1))
        year=re.search(r'年份: (.*)',a)
        if year==None:
            movie_year.append(" ")
        else:
            year_str=year.group(1)
            sj=int(year_str[:2])+1
            nd=year_str[2]+'0'
            movie_year.append(str(sj)+'世紀(jì)'+nd+'年代')

2.數(shù)據(jù)清洗

數(shù)據(jù)得到手焚挠,我們就需要對我們爬取的數(shù)據(jù)進(jìn)行清洗工作,為之后的數(shù)據(jù)分析做鋪墊漓骚,如果清洗的不到位勢必會對之后的數(shù)據(jù)分析造成影響。

2.1空值處理

對于數(shù)據(jù)中存在的空值榛泛,直接用空字符代替空值數(shù)據(jù)

        #對空值和字符進(jìn)行處理
        if tp==None:
            movie_types.append(" ")
        else:
            movie_types.append(tp.group(1))
        actor = re.search(r'主演: (.*)',a)
        if actor==None:
            movie_actor.append(" ")
        else:
            movie_actor.append(actor.group(1))
        director = re.search(r'導(dǎo)演: (.*)',a)
        if director==None:
            movie_director.append(" ")
        else:
            movie_director.append(director.group(1))
        addr = re.search(r'制片國家/地區(qū): (.*)',a)
        if addr==None:
            movie_addr.append(" ")
        else:
            movie_addr.append(addr.group(1))
        year=re.search(r'年份: (.*)',a)
        if year==None:
            movie_year.append(" ")
        else:
            year_str=year.group(1)
            sj=int(year_str[:2])+1
            nd=year_str[2]+'0'
            movie_year.append(str(sj)+'世紀(jì)'+nd+'年代')

2.2格式統(tǒng)一

由于每個電影年分不同蝌蹂,不便于后面分析,故需將年份替換為世紀(jì)曹锨、年代

year=re.search(r'年份: (.*)',a)
        if year==None:
            movie_year.append(" ")
        else:
            year_str=year.group(1)
            sj=int(year_str[:2])+1
            nd=year_str[2]+'0'
            movie_year.append(str(sj)+'世紀(jì)'+nd+'年代')

3.數(shù)據(jù)存取

本博客將數(shù)據(jù)存儲到CSV中

3.1存儲到CSV文件中

將爬取的信息以列表的形式保存到all_movies_message中孤个,并存儲到豆瓣.csv文件中,用以后面的數(shù)據(jù)分析

movies=get_movies("https://www.douban.com/doulist/240962/")
movies_1=pd.DataFrame({'movie_names':movies[0],'movie_types':movies[1],'movie_director':movies[6],'movie_actor':movies[5],'movie_dis':movies[2],'movie_grade':movies[3],'movie_addr':movies[4],'movie_year':movies[7]})
for i in range(1,4):
    #總共3頁沛简,一頁25個
    link="https://www.douban.com/doulist/240962/?start="+str(i*25)
    movies=get_movies(link)
    movies_1=movies_1.append(pd.DataFrame({'movie_names':movies[0],'movie_types':movies[1],'movie_director':movies[6],'movie_actor':movies[5],'movie_dis':movies[2],'movie_grade':movies[3],'movie_addr':movies[4],'movie_year':movies[7]}),ignore_index=True)
all_movies_message=movies_1
#將數(shù)據(jù)寫入豆瓣.csv文件中
all_movies_message.to_csv('豆瓣.csv',index=False)
print(all_movies_message)

存儲數(shù)據(jù)截圖:


在這里插入圖片描述

4.數(shù)據(jù)分析及可視化

數(shù)據(jù)表格的參數(shù)信息


在這里插入圖片描述

4.1對每個年代電影上榜數(shù)量進(jìn)行分析

對豆瓣高分電影每個年代上榜電影數(shù)量進(jìn)行分析齐鲤,可對年代劃分為10個等級:
分別為20世紀(jì)20年代斥废,20世紀(jì)30年代,20世紀(jì)40年代给郊,20世紀(jì)50年代牡肉,20世紀(jì)60年代,20世紀(jì)70年代淆九,20世紀(jì)80年代统锤,20世紀(jì)90年代,21世紀(jì)00年代炭庙,21世紀(jì)10年代

y1=len(data[data['movie_year']=='20世紀(jì)20年代'])
y2=len(data[data['movie_year']=='20世紀(jì)30年代'])
y3=len(data[data['movie_year']=='20世紀(jì)40年代'])
y4=len(data[data['movie_year']=='20世紀(jì)50年代'])
y5=len(data[data['movie_year']=='20世紀(jì)60年代'])
y6=len(data[data['movie_year']=='20世紀(jì)70年代'])
y7=len(data[data['movie_year']=='20世紀(jì)80年代'])
y8=len(data[data['movie_year']=='20世紀(jì)90年代'])
y9=len(data[data['movie_year']=='21世紀(jì)00年代'])
y10=len(data[data['movie_year']=='21世紀(jì)10年代'])

再通過matplotlib數(shù)據(jù)庫進(jìn)行數(shù)據(jù)的可視化得到下圖:

# 坐標(biāo)軸上能顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 調(diào)節(jié)圖形大小
plt.rcParams['figure.figsize']=[13,8]
#定義標(biāo)簽
labels=['20世紀(jì)20年代','20世紀(jì)30年代','20世紀(jì)40年代','20世紀(jì)50年代','20世紀(jì)60年代','20世紀(jì)70年代','20世紀(jì)80年代','20世紀(jì)90年代','21世紀(jì)00年代','21世紀(jì)10年代']
# 每一小塊的值
sizes=[y1,y2,y3,y4,y5,y6,y7,y8,y9,y10]
explode=(0,0,0,0,0,0,0,0,0,0)
plt.pie(
    sizes,
    explode=explode,
    labels=labels,
    autopct='%1.1f%%'#數(shù)據(jù)保留固定小數(shù)位
)
# x,y軸刻度設(shè)置一致
plt.axis('equal')
plt.title('電影年代上榜數(shù)量分布圖')
# 右上角顯示
plt.legend()
plt.show()

在這里插入圖片描述

通過圖可以很清晰的看到饲窿,20世紀(jì)70年代高分電影最少,20世紀(jì)90年代和21世紀(jì)00年代高分電影最多

4.2對每個年代電影評分分析

對豆瓣高分電影的電影評分進(jìn)行分析焕蹄,我們可以求出每個年代的電影平均分逾雄,進(jìn)而進(jìn)行分析:

import matplotlib.pyplot as plt
# 調(diào)節(jié)圖形大小
plt.rcParams['figure.figsize']=[12,8]
grouped=data.groupby(data['movie_year'])['movie_grade'].mean()
grouped.plot()
plt.xticks(rotation=60)#夾角旋轉(zhuǎn)60度
plt.xlabel('The movie year',fontsize=15)#x軸及字號
plt.ylabel('The movie grade',fontsize=15)#y軸及字號

對數(shù)據(jù)通過matplotlib數(shù)據(jù)庫進(jìn)行數(shù)據(jù)的可視化:


在這里插入圖片描述

從折線圖中,我們可以看出每個年代的平均評分都在9.0分以上

4.3對電影評論數(shù)前十分析

豆瓣高分電影中腻脏,評論越多說明該電影觀眾越活躍鸦泳,以電影評論人數(shù)進(jìn)行查找

d1=data.nlargest(10,columns='movie_dis')
d1

在這里插入圖片描述

對數(shù)據(jù)通過matplotlib數(shù)據(jù)庫進(jìn)行數(shù)據(jù)的可視化:

# 調(diào)節(jié)圖形大小
plt.rcParams['figure.figsize']=[12,8]
grouped=d1.groupby(d1['movie_names']).mean()
grouped.plot.bar()
plt.xticks(rotation=60)#夾角旋轉(zhuǎn)60度
plt.xlabel('The movie of number',fontsize=15)#x軸及字號
plt.ylabel('The movie of names',fontsize=15)#y軸及字號
plt.title('The movies of top 10')
plt.show()

在這里插入圖片描述

從圖中可以看出,肖申克的救贖評論的人最多迹卢,說明該電影觀眾最為活躍辽故,電影感觸最深

4.4對電影類型的分析

豆瓣高分電影類型有很多種,通過各個類型出現(xiàn)的次數(shù),可以判斷出那種類型最受歡迎
查找各個類型出現(xiàn)的次數(shù)

types='/'.join(data['movie_types'])#轉(zhuǎn)化成以‘/’間隔的字符串
types=types.replace(' ','')#將空格值進(jìn)行替換
typelist=types.split('/')#進(jìn)行切割
t=list(set(typelist))#去除重復(fù)
count=[]
for i in t:
    count.append(typelist.count(i))#統(tǒng)計出現(xiàn) 次數(shù)
plt.bar(range(len(count)),count,width=0.5)

對數(shù)據(jù)通過matplotlib數(shù)據(jù)庫進(jìn)行數(shù)據(jù)的可視化:

# 坐標(biāo)軸上能顯示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 調(diào)節(jié)圖形大小
plt.rcParams['figure.figsize']=[12,8]
plt.xticks(rotation=60)#夾角旋轉(zhuǎn)60度
plt.xlabel('電影類型',fontsize=15)#x軸及字號
plt.ylabel('數(shù)量',fontsize=15)#y軸及字號
plt.xticks(range(len(t)),t)
plt.title('電影類型分布情況')
plt.show()

在這里插入圖片描述

由柱狀圖可知腐碱,劇情片最受歡迎誊垢,其次為喜劇、愛情症见、家庭片
用詞云進(jìn)行可視化:

# 解決中文亂碼問題
font=r'C:\windows\Fonts\simfang.ttf'
string=' '.join(typelist)
w=wordcloud.WordCloud(background_color='white',font_path=font)
w.generate(string)
w.to_file(r"db.png")

在這里插入圖片描述

從詞云圖中可以看出喂走,劇情、愛情谋作、戲劇芋肠、犯罪、家庭遵蚜、冒險的頻率比較高

總結(jié)

從我們爬取到的數(shù)據(jù)來看
20世紀(jì)70年代高分電影最少帖池,20世紀(jì)90年代和21世紀(jì)00年代高分電影最多
肖申克的救贖評論的人最多,說明該電影觀眾最為活躍吭净,電影感觸最深
劇情片最受歡迎睡汹,其次為喜劇、愛情寂殉、家庭片

我是白白囚巴,一個喜歡學(xué)習(xí)喜歡編程的年輕人
記得看我資料
想學(xué)習(xí)python的可以關(guān)注私信我哦~
歡迎小白、萌新、大佬加入我們
小白學(xué)習(xí)交流基地【(九七四)(七二四)(八九四)】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彤叉,一起剝皮案震驚了整個濱河市庶柿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秽浇,老刑警劉巖浮庐,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兼呵,居然都是意外死亡兔辅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門击喂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來维苔,“玉大人,你說我怎么就攤上這事懂昂〗槭保” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵凌彬,是天一觀的道長沸柔。 經(jīng)常有香客問我,道長铲敛,這世上最難降的妖魔是什么褐澎? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮伐蒋,結(jié)果婚禮上工三,老公的妹妹穿的比我還像新娘。我一直安慰自己先鱼,他們只是感情好俭正,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焙畔,像睡著了一般掸读。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宏多,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天儿惫,我揣著相機(jī)與錄音,去河邊找鬼伸但。 笑死姥闪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砌烁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼函喉!你這毒婦竟也來了避归?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤管呵,失蹤者是張志新(化名)和其女友劉穎梳毙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捐下,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡账锹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坷襟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸柬。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婴程,靈堂內(nèi)的尸體忽然破棺而出廓奕,到底是詐尸還是另有隱情,我是刑警寧澤档叔,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布桌粉,位于F島的核電站,受9級特大地震影響衙四,放射性物質(zhì)發(fā)生泄漏铃肯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一传蹈、第九天 我趴在偏房一處隱蔽的房頂上張望押逼。 院中可真熱鬧,春花似錦卡睦、人聲如沸宴胧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恕齐。三九已至,卻和暖如春瞬逊,著一層夾襖步出監(jiān)牢的瞬間显歧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工确镊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留士骤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓蕾域,卻偏偏與公主長得像拷肌,于是被迫代替她去往敵國和親到旦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容