Python網絡爬蟲——爬取豆瓣電影劇情片排行榜


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.通過本次課程設計的學習,我也了解到自己知識點的薄弱,許多問題無法自行解決,需要翻閱資料,查看網絡相關視頻、請教同學才能解決相應問題,因此在后面的學習過程中應該更加認真。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM