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í)交流基地【(九七四)(七二四)(八九四)】