Python網絡爬蟲——爬取豆瓣劇情片排行榜
一、 選題的背景
為什么要選擇此選題?要達到的數據分析的預期目標是什么?(10分)
電影行業的興起,引發許多的熱潮,劇情片又是電影的一大種類,非常具有意義。爬取之后可以更直觀的明白劇情片排行的相應情況。
從社會、經濟、技術、數據來源等方面進行描述(200字以內)
疫情當前,許多人只能居家,電影自然就成了大家消遣的一大方式,清楚的了解電影相關的數據,可以使人們更好的明白如何去選擇優質的電影。
二、主題式網絡爬蟲設計方案(10分)
1.主題式網絡爬蟲名稱
Python網絡爬蟲——爬取豆瓣劇情片排行榜
2.主題式網絡爬蟲爬取的內容與數據特征分析
爬取豆瓣劇情片排行數據做可視化處理
3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)
步驟:首先,先確定此次的選題的主題內容,然后爬取豆瓣劇情熱搜排行,設計爬取程序進行爬取(爬取內容時會遇到爬出來的數據為***萬人,思考如何將此數據變成數字),將爬取的數據做成xsl表格時(
1. 進行可視化處理。最后,保存數據。
三、主題頁面的結構特征分析
1.主題頁面的結構與特征分析
1.主題頁面的結構與特征分析:打開開發者控制工具,通過逐個檢索分析找到自己需要的數據,發現所需的標簽都在<body>的<div>中。
2.Htmls頁面解析
四、網絡爬蟲程序設計
1 import requests 2 import json 3 url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20' 4 head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.6241 SLBChan/25'} 5 r=requests.get(url,headers=head) 6 r.encoding = "utf-8" 7 data=json.loads(r.text) 8 a=data 9 for i in data: 10 print(i)
1 rank=[] 2 name=[] 3 vote=[] 4 actor=[] 5 score=[] 6 for i in a: 7 rank.append(i['rank']) 8 name.append(i['title']) 9 vote.append(i['vote_count']) 10 actor.append(i['actor_count']) 11 score.append(i[ 'score']) 12 print(rank) 13 print(name) 14 print(vote) 15 print(actor) 16 print(score)
1 import pandas as pd 2 df=pd.DataFrame({'排名':rank,'電影名':name}) 3 df['評論數']=vote 4 df['演員數']=actor 5 df['評分']=score 6 df 7 df.to_csv('D:\Python\豆瓣電影.txt') 8 df.to_csv('D:\Python\豆瓣電影.csv',index=False)
1 #刪除無效列 2 #df.drop('電影名',axis=1,inplace=True) 3 df.head()
1 #刪除無效列 2 df.drop('演員數',axis=1,inplace=True) 3 print(df.head)
1 #檢查是否有重復值 2 print(df.duplicated())
#檢查是否有空值 print(df['評分'].isnull().value_counts()) #檢查是否有空值 print(df['排名'].isnull().value_counts()) #檢查是否有空值 print(df['評論數'].isnull().value_counts()) #檢查是否有空值 print(df['演員數'].isnull().value_counts())
1 #數據分析 2 from sklearn.linear_model import LinearRegression 3 X = df.drop("評論數",axis=1) 4 predict_model = LinearRegression() 5 predict_model.fit(X,df['排名']) 6 print("回歸系數為:",predict_model.coef_) 7 #數據分析 8 from sklearn.linear_model import LinearRegression 9 X = df.drop("評論數",axis=1) 10 predict_model = LinearRegression() 11 predict_model.fit(X,df['評分']) 12 print("回歸系數為:",predict_model.coef_) 13 #數據分析 14 from sklearn.linear_model import LinearRegression 15 X = df.drop("評分",axis=1) 16 predict_model = LinearRegression() 17 predict_model.fit(X,df['排名']) 18 print("回歸系數為:",predict_model.coef_)
1 #繪制排名與熱度的回歸圖 2 import seaborn as sns 3 sns.regplot(df['排名'],df['評論數'])
1 #柱形圖 2 import matplotlib.pyplot as plt 3 import pandas as pd 4 import numpy as np 5 data=pd.Series(vote[0:10],name[0:10]) 6 print(data) 7 #索引 8 index=np.arange(1,11) 9 #用來正常顯示中文標簽 10 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 11 #用來正常顯示負號 12 plt.rcParams['axes.unicode_minus']=False 13 #修改x軸字體大小為12 14 plt.xticks(fontsize=12) 15 #修改y軸字體大小為12 16 plt.yticks(fontsize=12) 17 print(data) 18 print(index) 19 #x標簽 20 plt.xlabel('電影名') 21 #y標簽 22 plt.ylabel('評論數') 23 data.plot(kind='bar',color='g') 24 plt.grid() 25 plt.show()
1 import matplotlib.pyplot as plt 2 plt.rcParams['font.sans-serif']='SimHei' 3 #設置中文顯示 4 plt.figure(figsize=(6,6)) 5 #將畫布設定為正方形,則繪制的餅圖是正圓 6 label=['美國','意大利','中國大陸','日本','澳大利亞'] 7 #定義餅圖的標簽,標簽是列表 8 explode=[0.01,0.01,0.01,0.01,0.01] 9 #設定各項距離圓心n個半徑 10 #plt.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%') 11 #繪制餅圖 12 values=[12,3,2,2,1] 13 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%') 14 #繪制餅圖 15 plt.title('電影地區餅狀圖') 16 #繪制標題 17 plt.savefig('./電影地區餅狀圖') 18 #保存圖片 19 plt.show()
1 import matplotlib.pyplot as plt 2 import matplotlib 3 import numpy as np 4 import scipy.optimize as opt 5 x0=df['排名'][0:10] 6 y0=df['評論數'][0:10]/10000 7 def func(x,c0): 8 a,b,c=c0 9 return a*x**2+b*x+c 10 def errfc(c0,x,y): 11 return y-func(x,c0) 12 c0=[0,2,3] 13 c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] 14 a,b,c=c1 15 print(f"擬合方程為:y={a}*x**2+{b}*x+{c}") 16 chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') 17 plt.plot(x0,y0,"ob",label="樣本數據") 18 plt.plot(x0,func(x0,c1),"r",label="擬合曲線") 19 plt.legend(loc=3,prop=chinese) 20 plt.ylabel('單位(萬)') 21 plt.show() 22 import matplotlib.pyplot as plt 23 import matplotlib 24 import numpy as np 25 import scipy.optimize as opt 26 x0=df['排名'][0:10] 27 y0=df['演員數'][0:10] 28 def func(x,c0): 29 a,b,c=c0 30 return a*x**2+b*x+c 31 def errfc(c0,x,y): 32 return y-func(x,c0) 33 c0=[0,2,3] 34 c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] 35 a,b,c=c1 36 print(f"擬合方程為:y={a}*x**2+{b}*x+{c}") 37 chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') 38 plt.plot(x0,y0,"ob",label="樣本數據") 39 plt.plot(x0,func(x0,c1),"r",label="擬合曲線") 40 plt.legend(loc=3,prop=chinese) 41 plt.ylabel('單位(個)') 42 plt.show()
1 plt.rcParams['font.sans-serif'] = ['SimHei'] 2 # 用來正常顯示中文標簽 3 plt.rcParams['axes.unicode_minus'] = False 4 # 用來正常顯示負號 5 N=10 6 x=np.random.rand(N) 7 y=np.random.rand(N) 8 size=50 9 plt.xlabel("排名") 10 plt.ylabel("評論數") 11 plt.scatter(x,y,size,color='r',alpha=0.5,marker="o") 12 #散點圖 kind='reg' 13 sns.jointplot(x="排名",y="評論數",data=df,kind='reg') 14 # kind='hex' 15 sns.jointplot(x="排名",y="評論數",data=df,kind='hex') 16 # kind='kde' 17 sns.jointplot(x="排名",y="評論數",data=df,kind="kde",space=0,color='g')
五、完整代碼
1 import requests 2 import json 3 url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20' 4 head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.6241 SLBChan/25'} 5 r=requests.get(url,headers=head) 6 r.encoding = "utf-8" 7 data=json.loads(r.text) 8 a=data 9 for i in data: 10 print(i) 11 rank=[] 12 name=[] 13 vote=[] 14 actor=[] 15 score=[] 16 for i in a: 17 rank.append(i['rank']) 18 name.append(i['title']) 19 vote.append(i['vote_count']) 20 actor.append(i['actor_count']) 21 score.append(i[ 'score']) 22 print(rank) 23 print(name) 24 print(vote) 25 print(actor) 26 print(score) 27 import pandas as pd 28 df=pd.DataFrame({'排名':rank,'電影名':name}) 29 df['評論數']=vote 30 df['演員數']=actor 31 df['評分']=score 32 df 33 df.to_csv('D:\Python\豆瓣電影.txt') 34 df.to_csv('D:\Python\豆瓣電影.csv',index=False) 35 #刪除無效列 36 #df.drop('電影名',axis=1,inplace=True) 37 df.head() 38 #刪除無效列 39 df.drop('演員數',axis=1,inplace=True) 40 print(df.head) 41 #檢查是否有重復值 42 print(df.duplicated()) 43 #檢查是否有空值 44 print(df['評分'].isnull().value_counts()) 45 #檢查是否有空值 46 print(df['排名'].isnull().value_counts()) 47 #檢查是否有空值 48 print(df['評論數'].isnull().value_counts()) 49 #檢查是否有空值 50 print(df['演員數'].isnull().value_counts()) 51 #數據分析 52 from sklearn.linear_model import LinearRegression 53 X = df.drop("評論數",axis=1) 54 predict_model = LinearRegression() 55 predict_model.fit(X,df['排名']) 56 print("回歸系數為:",predict_model.coef_) 57 #數據分析 58 from sklearn.linear_model import LinearRegression 59 X = df.drop("評論數",axis=1) 60 predict_model = LinearRegression() 61 predict_model.fit(X,df['評分']) 62 print("回歸系數為:",predict_model.coef_) 63 #數據分析 64 from sklearn.linear_model import LinearRegression 65 X = df.drop("評分",axis=1) 66 predict_model = LinearRegression() 67 predict_model.fit(X,df['排名']) 68 print("回歸系數為:",predict_model.coef_) 69 #繪制排名與熱度的回歸圖 70 import seaborn as sns 71 sns.regplot(df['排名'],df['評論數']) 72 #柱形圖 73 import matplotlib.pyplot as plt 74 import pandas as pd 75 import numpy as np 76 data=pd.Series(vote[0:10],name[0:10]) 77 print(data) 78 #索引 79 index=np.arange(1,11) 80 #用來正常顯示中文標簽 81 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 82 #用來正常顯示負號 83 plt.rcParams['axes.unicode_minus']=False 84 #修改x軸字體大小為12 85 plt.xticks(fontsize=12) 86 #修改y軸字體大小為12 87 plt.yticks(fontsize=12) 88 print(data) 89 print(index) 90 #x標簽 91 plt.xlabel('電影名') 92 #y標簽 93 plt.ylabel('評論數') 94 data.plot(kind='bar',color='g') 95 plt.grid() 96 plt.show() 97 import matplotlib.pyplot as plt 98 plt.rcParams['font.sans-serif']='SimHei' 99 #設置中文顯示 100 plt.figure(figsize=(6,6)) 101 #將畫布設定為正方形,則繪制的餅圖是正圓 102 label=['美國','意大利','中國大陸','日本','澳大利亞'] 103 #定義餅圖的標簽,標簽是列表 104 explode=[0.01,0.01,0.01,0.01,0.01] 105 #設定各項距離圓心n個半徑 106 #plt.pie(values[-1,3:6],explode=explode,labels=label,autopct='%1.1f%%') 107 #繪制餅圖 108 values=[12,3,2,2,1] 109 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%') 110 #繪制餅圖 111 plt.title('電影地區餅狀圖') 112 #繪制標題 113 plt.savefig('./電影地區餅狀圖') 114 #保存圖片 115 plt.show() 116 import matplotlib.pyplot as plt 117 import matplotlib 118 import numpy as np 119 import scipy.optimize as opt 120 x0=df['排名'][0:10] 121 y0=df['評論數'][0:10]/10000 122 def func(x,c0): 123 a,b,c=c0 124 return a*x**2+b*x+c 125 def errfc(c0,x,y): 126 return y-func(x,c0) 127 c0=[0,2,3] 128 c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] 129 a,b,c=c1 130 print(f"擬合方程為:y={a}*x**2+{b}*x+{c}") 131 chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') 132 plt.plot(x0,y0,"ob",label="樣本數據") 133 plt.plot(x0,func(x0,c1),"r",label="擬合曲線") 134 plt.legend(loc=3,prop=chinese) 135 plt.ylabel('單位(萬)') 136 plt.show() 137 import matplotlib.pyplot as plt 138 import matplotlib 139 import numpy as np 140 import scipy.optimize as opt 141 x0=df['排名'][0:10] 142 y0=df['演員數'][0:10] 143 def func(x,c0): 144 a,b,c=c0 145 return a*x**2+b*x+c 146 def errfc(c0,x,y): 147 return y-func(x,c0) 148 c0=[0,2,3] 149 c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] 150 a,b,c=c1 151 print(f"擬合方程為:y={a}*x**2+{b}*x+{c}") 152 chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') 153 plt.plot(x0,y0,"ob",label="樣本數據") 154 plt.plot(x0,func(x0,c1),"r",label="擬合曲線") 155 plt.legend(loc=3,prop=chinese) 156 plt.ylabel('單位(個)') 157 plt.show() 158 plt.rcParams['font.sans-serif'] = ['SimHei'] 159 # 用來正常顯示中文標簽 160 plt.rcParams['axes.unicode_minus'] = False 161 # 用來正常顯示負號 162 N=10 163 x=np.random.rand(N) 164 y=np.random.rand(N) 165 size=50 166 plt.xlabel("排名") 167 plt.ylabel("評論數") 168 plt.scatter(x,y,size,color='r',alpha=0.5,marker="o") 169 #散點圖 kind='reg' 170 sns.jointplot(x="排名",y="評論數",data=df,kind='reg') 171 # kind='hex' 172 sns.jointplot(x="排名",y="評論數",data=df,kind='hex') 173 # kind='kde' 174 sns.jointplot(x="排名",y="評論數",data=df,kind="kde",space=0,color='g')
六、總結
1.經過對主題數據的分析和可視化,發現劇情片排名靠前的電影不一定評論數多,有幾部電影的評論較少,因此評分高不一定代表熱度評論數就多。
2.在數據處理上,有些數據無法進行相關分析,像評分與排名之間就無法做出相關線性圖,因此只能用評論數和排名進行相關分析,不過柱狀圖、餅狀圖就可對其進行相關分析,可以更加直觀的看起其對應的關系,可以更好的對數據進行分析。
3.通過本次課程設計的學習,我也了解到自己知識點的薄弱,許多問題無法自行解決,需要翻閱資料,查看網絡相關視頻、請教同學才能解決相應問題,因此在后面的學習過程中應該更加認真。