1、數據抓取
首先我們要收集數據才能進行數據分析。獲取數據的主要途徑:現成數據、自己用爬蟲爬取得到的數據;使用現有的爬蟲工具爬取所需內容,保存到數據庫,或以文件的形式保存到本地。
而我是用python軟件爬取的豆瓣高分電影信息,用以獲取其中的數據。
1.1網頁分析
1.網頁URL地址:https://www.douban.com/doulist/240962/
2.根據URL在瀏覽器打開網頁的首頁:

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

從檢查得到的源代碼可以看到:
class=‘title’的div標簽文本中存放着電影名稱
class=‘rating’的div標簽中存放着星級,評分和評價人數
class=‘abstract’的div標簽中存放着導演,主演,類型,制片國家/地區和年份的信息
1.2獲取信息
通過網頁分析可知,我們所需要的信息都在HTML頁面里,所以我們只需要獲取HTML頁面相應class類div中的信息就可以了
1.獲得網頁所有數據:
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標簽的text的內容就是中文電影名稱 movie_name=each.a.text.strip() movie_names.append(movie_name)
3.獲取電影評分和評價人數:
for each in soup.find_all('div',class_='rating'): #在div中,第二個span的text內容為評分,第三個span的text的內容為評價人數 a=each.text.split('\n') #獲取字符串中的數字 x=''.join(re.findall(r'[0-9]',str(a[3]))) movie_dis.append(x) movie_grade.append(float(a[2]))
4.獲取電影導演,主演,類型,制片國家/地區和年份的信息:
for each in soup.find_all('div',class_='abstract'): a=each.text #.匹配任意字符,除了換行符 tp = re.search(r'類型: (.*)',a) #對空值和字符進行處理 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'導演: (.*)',a) if director==None: movie_director.append(" ") else: movie_director.append(director.group(1)) addr = re.search(r'制片國家/地區: (.*)',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)+'世紀'+nd+'年代')
2.數據清洗
數據得到手,我們就需要對我們爬取的數據進行清洗工作,為之后的數據分析做鋪墊,如果清洗的不到位勢必會對之后的數據分析造成影響。
2.1空值處理
對於數據中存在的空值,直接用空字符代替空值數據
#對空值和字符進行處理 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'導演: (.*)',a) if director==None: movie_director.append(" ") else: movie_director.append(director.group(1)) addr = re.search(r'制片國家/地區: (.*)',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)+'世紀'+nd+'年代')
2.2格式統一
由於每個電影年分不同,不便於后面分析,故需將年份替換為世紀、年代
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)+'世紀'+nd+'年代')
3.數據存取
本博客將數據存儲到CSV中
3.1存儲到CSV文件中
將爬取的信息以列表的形式保存到all_movies_message中,並存儲到豆瓣.csv文件中,用以后面的數據分析
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 #將數據寫入豆瓣.csv文件中 all_movies_message.to_csv('豆瓣.csv',index=False) print(all_movies_message)
存儲數據截圖:

4.數據分析及可視化
數據表格的參數信息

4.1對每個年代電影上榜數量進行分析
對豆瓣高分電影每個年代上榜電影數量進行分析,可對年代划分為10個等級:
分別為20世紀20年代,20世紀30年代,20世紀40年代,20世紀50年代,20世紀60年代,20世紀70年代,20世紀80年代,20世紀90年代,21世紀00年代,21世紀10年代
y1=len(data[data['movie_year']=='20世紀20年代']) y2=len(data[data['movie_year']=='20世紀30年代']) y3=len(data[data['movie_year']=='20世紀40年代']) y4=len(data[data['movie_year']=='20世紀50年代']) y5=len(data[data['movie_year']=='20世紀60年代']) y6=len(data[data['movie_year']=='20世紀70年代']) y7=len(data[data['movie_year']=='20世紀80年代']) y8=len(data[data['movie_year']=='20世紀90年代']) y9=len(data[data['movie_year']=='21世紀00年代']) y10=len(data[data['movie_year']=='21世紀10年代'])
再通過matplotlib數據庫進行數據的可視化得到下圖:
# 坐標軸上能顯示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 調節圖形大小 plt.rcParams['figure.figsize']=[13,8] #定義標簽 labels=['20世紀20年代','20世紀30年代','20世紀40年代','20世紀50年代','20世紀60年代','20世紀70年代','20世紀80年代','20世紀90年代','21世紀00年代','21世紀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%%'#數據保留固定小數位 ) # x,y軸刻度設置一致 plt.axis('equal') plt.title('電影年代上榜數量分布圖') # 右上角顯示 plt.legend() plt.show()

通過圖可以很清晰的看到,20世紀70年代高分電影最少,20世紀90年代和21世紀00年代高分電影最多
4.2對每個年代電影評分分析
對豆瓣高分電影的電影評分進行分析,我們可以求出每個年代的電影平均分,進而進行分析:
import matplotlib.pyplot as plt # 調節圖形大小 plt.rcParams['figure.figsize']=[12,8] grouped=data.groupby(data['movie_year'])['movie_grade'].mean() grouped.plot() plt.xticks(rotation=60)#夾角旋轉60度 plt.xlabel('The movie year',fontsize=15)#x軸及字號 plt.ylabel('The movie grade',fontsize=15)#y軸及字號
對數據通過matplotlib數據庫進行數據的可視化:

從折線圖中,我們可以看出每個年代的平均評分都在9.0分以上
4.3對電影評論數前十分析
豆瓣高分電影中,評論越多說明該電影觀眾越活躍,以電影評論人數進行查找
d1=data.nlargest(10,columns='movie_dis') d1

對數據通過matplotlib數據庫進行數據的可視化:
# 調節圖形大小 plt.rcParams['figure.figsize']=[12,8] grouped=d1.groupby(d1['movie_names']).mean() grouped.plot.bar() plt.xticks(rotation=60)#夾角旋轉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對電影類型的分析
豆瓣高分電影類型有很多種,通過各個類型出現的次數,可以判斷出那種類型最受歡迎
查找各個類型出現的次數
types='/'.join(data['movie_types'])#轉化成以‘/’間隔的字符串 types=types.replace(' ','')#將空格值進行替換 typelist=types.split('/')#進行切割 t=list(set(typelist))#去除重復 count=[] for i in t: count.append(typelist.count(i))#統計出現 次數 plt.bar(range(len(count)),count,width=0.5)
對數據通過matplotlib數據庫進行數據的可視化:
# 坐標軸上能顯示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 調節圖形大小 plt.rcParams['figure.figsize']=[12,8] plt.xticks(rotation=60)#夾角旋轉60度 plt.xlabel('電影類型',fontsize=15)#x軸及字號 plt.ylabel('數量',fontsize=15)#y軸及字號 plt.xticks(range(len(t)),t) plt.title('電影類型分布情況') plt.show()

由柱狀圖可知,劇情片最受歡迎,其次為喜劇、愛情、家庭片
用詞雲進行可視化:
# 解決中文亂碼問題 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")

從詞雲圖中可以看出,劇情、愛情、戲劇、犯罪、家庭、冒險的頻率比較高
總結
從我們爬取到的數據來看
20世紀70年代高分電影最少,20世紀90年代和21世紀00年代高分電影最多
肖申克的救贖評論的人最多,說明該電影觀眾最為活躍,電影感觸最深
劇情片最受歡迎,其次為喜劇、愛情、家庭片
我是白白,一個喜歡學習喜歡編程的年輕人
記得看我資料
想學習python的可以關注私信我哦~
歡迎小白、萌新、大佬加入我們
小白學習交流基地【(九七四)(七二四)(八九四)】