Python資料分析–豆瓣電影Top250

利用Python爬取豆瓣電影TOP250并進行資料分析,對于眾多爬蟲愛好者,應該并不陌生,很多人都會以此作為第一個練手的小專案,當然這也多虧了豆瓣的包容,沒有加以太多的反爬措施,對新手比較友好,
手動宣告
著作權宣告:本文為博主原創文章,創作不易
本文鏈接:https://blog.csdn.net/qq_45176548/article/details/112735850
文章目錄
- Python資料分析--豆瓣電影Top250
- 資料爬取
- 翻頁操作
- 反扒說明
- 通過headers欄位來反爬
- 通過請求引數來反爬
- 資料定位
- 資料分析
- 資料預處理
- 上映年份分布
- 評分分布情況
- 排名與評分分布情況
- 評論人數TOP10
- 導演排名
- 電影型別圖
資料爬取

翻頁操作
第一頁:https://movie.douban.com/top250
第二頁:https://movie.douban.com/top250?start=25&filter=
第三頁:https://movie.douban.com/top250?start=50&filter=
觀察可知,我們只需要修改start引數即可
反扒說明
推薦閱讀:
- 一篇文章帶你掌握requests模塊
- Python網路爬蟲基礎–BeautifulSoup
通過headers欄位來反爬
headers中有很多欄位,這些欄位都有可能會被對方服務器拿過來進行判斷是否為爬蟲
1.1 通過headers中的User-Agent欄位來反爬
- 反爬原理:爬蟲默認情況下沒有User-Agent,而是使用模塊默認設定
- 解決方法:請求之前添加User-Agent即可;更好的方式是使用User-Agent池來解決(收集一堆User-Agent的方式,或者是隨機生成User-Agent)
1.2 通過referer欄位或者是其他欄位來反爬
- 反爬原理:爬蟲默認情況下不會帶上referer欄位,服務器端通過判斷請求發起的源頭,以此判斷請求是否合法
- 解決方法:添加referer欄位
1.3 通過cookie來反爬
- 反爬原因:通過檢查cookies來查看發起請求的用戶是否具備相應權限,以此來進行反爬
- 解決方案:進行模擬登陸,成功獲取cookies之后在進行資料爬取
通過請求引數來反爬
請求引數的獲取方法有很多,向服務器發送請求,很多時候需要攜帶請求引數,通常服務器端可以通過檢查請求引數是否正確來判斷是否為爬蟲
2.1 通過從html靜態檔案中獲取請求資料(github登錄資料)
- 反爬原因:通過增加獲取請求引數的難度進行反爬
- 解決方案:仔細分析抓包得到的每一個包,搞清楚請求之間的聯系
2.2 通過發送請求獲取請求資料
- 反爬原因:通過增加獲取請求引數的難度進行反爬
- 解決方案:仔細分析抓包得到的每一個包,搞清楚請求之間的聯系,搞清楚請求引數的來源
2.3 通過js生成請求引數
- 反爬原理:js生成了請求引數
- 解決方法:分析js,觀察加密的實作程序,通過js2py獲取js的執行結果,或者使用selenium來實作
2.4 通過驗證碼來反爬
- 反爬原理:對方服務器通過彈出驗證碼強制驗證用戶瀏覽行為
- 解決方法:打碼平臺或者是機器學習的方法識別驗證碼,其中打碼平臺廉價易用,更值得推薦
在這里我們只需要添加請求頭即可

資料定位
這里我使用的是xpath
推薦閱讀:
- 使用xpath爬取資料
- jupyter notebook使用
- BeautifulSoup爬取豆瓣電影Top250
# -*- coding: utf-8 -*-
# @Author: Kun
import requests
from lxml import etree
import pandas as pd
df = []
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4343.0 Safari/537.36',
'Referer': 'https://movie.douban.com/top250'}
columns = ['排名','電影名稱','導演','上映年份','制作國家','型別','評分','評價分數','短評']
def get_data(html):
xp = etree.HTML(html)
lis = xp.xpath('//*[@id="content"]/div/div[1]/ol/li')
for li in lis:
"""排名、標題、導演、演員、"""
ranks = li.xpath('div/div[1]/em/text()')
titles = li.xpath('div/div[2]/div[1]/a/span[1]/text()')
directors = li.xpath('div/div[2]/div[2]/p[1]/text()')[0].strip().replace("\xa0\xa0\xa0","\t").split("\t")
infos = li.xpath('div/div[2]/div[2]/p[1]/text()')[1].strip().replace('\xa0','').split('/')
dates,areas,genres = infos[0],infos[1],infos[2]
ratings = li.xpath('.//div[@class="star"]/span[2]/text()')[0]
scores = li.xpath('.//div[@class="star"]/span[4]/text()')[0][:-3]
quotes = li.xpath('.//p[@class="quote"]/span/text()')
for rank,title,director in zip(ranks,titles,directors):
if len(quotes) == 0:
quotes = None
else:
quotes = quotes[0]
df.append([rank,title,director,dates,areas,genres,ratings,scores,quotes])
d = pd.DataFrame(df,columns=columns)
d.to_excel('Top250.xlsx',index=False)
for i in range(0,251,25):
url = "https://movie.douban.com/top250?start={}&filter=".format(str(i))
res = requests.get(url,headers=headers)
html = res.text
get_data(html)
原文鏈接:https://blog.csdn.net/qq_45176548/article/details/112735850
結果如下:

原文鏈接
資料分析
獲取資料后,就可以對自己感興趣的內容進行分析了
資料預處理
- 上映年份格式不統一
year = []
for i in df["上映年份"]:
i = i[0:4]
year.append(i)
df["上映年份"] = year
df["上映年份"].value_counts()
x1 = list(df["上映年份"].value_counts().sort_index().index)
y1 = list(df["上映年份"].value_counts().sort_index().values)
y1 = [str(i) for i in y1]
上映年份分布
c1 = (
Bar()
.add_xaxis(x1)
.add_yaxis("影片數量", y1)
.set_global_opts(
title_opts=opts.TitleOpts(title="Top250年份分布"),
datazoom_opts=opts.DataZoomOpts(),
)
.render("1.html")
)

這里可以看出豆瓣電影TOP250里,電影的上映年份,多分布于80年代以后,其中有好幾年是在10部及以上的,
評分分布情況
plt.figure(figsize=(10,6))
plt.hist(list(df["評分"]),bins=8,facecolor="blue", edgecolor="black", alpha=0.7)
plt.show()

大多分布于「8.5」到「9.2」之間,最低「8.3」,最高「9.6」
排名與評分分布情況
plt.figure(figsize=(10,5), dpi=100)
plt.scatter(df.index,df['評分'])
plt.show()

總的來說,排名越靠前,評價人數越多,并且分數也越高,
評論人數TOP10
c2 = (
Bar()
.add_xaxis(df1["電影名稱"].to_list())
.add_yaxis("評論數", df1["評價分數"].to_list(),color=Faker.rand_color())
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="電影評論Top10"))
.render("2.html")
)

讓我們來看看人氣最高的有哪些影片,你又看過幾部呢?
導演排名

可以看到這些導演很🐂呀
電影型別圖
from collections import Counter
colors = ' '.join([i for i in df[ '型別']]).strip().split()
c = dict(Counter(colors))
c

發現有個錯誤值
d = c.pop('1978(中國大陸)')
洗掉即可
- 對于洗掉字典的值有以下方法
方法一 pop(key[,default])
d = {'a':1,'b':2,'c':3}
# 洗掉key值為'a'的元素,并賦值給變數e1
e1 = d.pop('a')
print(e1)
# 如果key不存在,則可以設定回傳值
e2 = d.pop('m','404')
print(e2)
# 如果key不存在,不設定回傳值就報錯
e3 = d.pop('m')
方法二 del[d[key]]
d = {'a':1,'b':2,'c':3}
# 洗掉給定key的元素
del d['a']
print(d)
# 洗掉不存在的元素
del d['m']
clear一次性洗掉所有字典元素
d = {'a':1,'b':2,'c':3}
print(d)
# 洗掉所有元素,允許d為{}
d.clear()
print(d)
統計展示

可視化展示
c = (
WordCloud()
.add(
"",
words,
word_size_range=[20, 100],
textstyle_opts=opts.TextStyleOpts(font_family="cursive"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="WordCloud-自定義文字樣式"))
.render("wordcloud_custom_font_style.html")
)

往期回顧
- 冰冰B站視頻彈幕爬取原理決議
- Python建立時間序列ARIMA模型實戰案例
- 使用xpath爬取資料
- jupyter notebook使用
- BeautifulSoup爬取豆瓣電影Top250
- 一篇文章帶你掌握requests模塊
- Python網路爬蟲基礎–BeautifulSoup
到這里就結束了,如果對你有幫助你,歡迎點贊關注,你的點贊對我很重要
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250229.html
標籤:python
上一篇:Python實作淘寶秒殺
