豆瓣高分電影資訊分析(資料分析)
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")
從詞云圖中可以看出,劇情、愛情、戲劇、犯罪、家庭、冒險的頻率比較高
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245682.html
標籤:python
