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.通过本次课程设计的学习,我也了解到自己知识点的薄弱,许多问题无法自行解决,需要翻阅资料,查看网络相关视频、请教同学才能解决相应问题,因此在后面的学习过程中应该更加认真。

 

 

posted @ 2021-12-28 20:17  软工4班李凌  阅读(903)  评论(1编辑  收藏  举报