爬取电影 Top 500 数据
Posted abcdefgh9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬取电影 Top 500 数据相关的知识,希望对你有一定的参考价值。
一.主题式网络主题式网络爬虫设计方案 1.爬虫名称:爬取电影 Top 500 数据 2.爬取内容:爬取电影排名,评分,介绍 3.网络爬虫设计方案概述: 思路:通过分析网页源代码,找出数据所在的标签,通过爬虫读取数据保存到csv文件中,读取文件,对数据进行清洗和处理,数据分析与可视化处理。 技术难点:数据量过少,所掌握的知识不够使用。 二.主题页面的结构特征分析 1.主题页面的结构和特征分析:爬取数据都分布在标签‘<ol class="grid_view">‘里面,电影名标签为‘span.title‘,评分标签为‘span.rating_num‘,介绍标签为‘span.inq‘。 2.htmls页面解析: 三、网络爬虫程序设计 1.数据的爬取与采集: 复制代码 def get_html(url): headers = {‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362‘}#伪装爬虫 resp = requests.get(url, headers = headers) return resp.text url = ‘https://movie.douban.com/top250‘ html = get_html(url) soup = BeautifulSoup(html, ‘html.parser‘) a = soup.find_all(‘div‘, class_=‘hd‘) #电影名 film_name = [] for i in a: film_name.append(i.a.span.text) #评分 rating_score = soup.find_all(‘span‘, class_=‘rating_num‘) #介绍 introduce = soup.find_all(‘span‘, class_=‘inq‘) lt = [] num = 20 for i in range(num): lt.append([i+1,film_name[i], rating_score[i].string, introduce[i].string]) df = pd.DataFrame(lt,columns = [‘排名‘, ‘电影名‘, ‘评分‘, ‘介绍‘]) print(df) df.to_csv(‘豆瓣电影数据.csv‘) #保存文件,数据持久化 复制代码 2.对数据进行清洗和处理: #读取csv文件 df = pd.DataFrame(pd.read_csv(‘豆瓣电影数据.csv‘)) df.head() #删除无效列与行 df.drop(‘电影名‘, axis=1, inplace = True) df.drop(‘介绍‘, axis=1, inplace = True) df.head() #检查是否有重复值 df.duplicated() #空值处理 df.isnull().sum()#返回0,表示没有空值 #缺失值处理 df[df.isnull().values==True]#返回无缺失值 #用describe()命令显示描述性统计指标 df.describe() 3.数据分析与可视化: #数据分析 X = df.drop("电影名",axis=1) predict_model = LinearRegression() predict_model.fit(X,df[‘评分‘]) print("回归系数为:",predict_model.coef_) #绘制排名与热度的回归图 plt.rcParams[‘font.sans-serif‘]=[‘STSong‘]#显示中文 sns.regplot(df.排名,df.评分) # 绘制垂直柱状图 plt.rcParams[‘axes.unicode_minus‘]=False #用来正常显示负号 plt.bar(df.排名, df.评分, label="排名与评分柱状图") plt.show() 复制代码 # 绘制散点图 def Scatter_point(): plt.scatter(df.排名, df.评分, color=‘red‘, s=25, marker="o") plt.xlabel("排名") plt.ylabel("评分") plt.title("排名与评分-散点图") plt.show() Scatter_point() 复制代码 复制代码 #绘制排名与热度折线图 def draw(): x = df[‘排名‘] y = df[‘评分‘] plt.xlabel(‘排名‘) plt.ylabel(‘评分‘) plt.plot(x,y) plt.scatter(x,y) plt.title("绘制排名与评分折线图") plt.show() draw() 复制代码 复制代码 #绘制排名与评分-箱体图(盒图) def draw1(): plt.figure(figsize=(10, 6)) plt.title(‘绘制排名与评分-箱体图‘) sns.boxplot(x=‘排名‘,y=‘评分‘, data=df) draw1() 复制代码 复制代码 #绘制部分分布图 sns.jointplot(x="排名",y=‘评分‘,data = df, kind=‘kde‘, color=‘r‘) sns.jointplot(x="排名",y=‘评分‘,data = df) sns.jointplot(x="排名",y=‘评分‘,data = df, kind=‘reg‘) sns.jointplot(x="排名",y=‘评分‘,data = df, kind=‘hex‘) 复制代码 4.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建立变量之间的回归方程(一元或多元) 复制代码 #绘制一元一次回归方程 def main(): colnames = ["排名", "电影名", "评分", "介绍"] df = pd.read_csv(‘豆瓣电影数据.csv‘,skiprows=1,names=colnames) X = df.排名 Y = df.评分 def func(p, x): k, b = p return k * x + b def error_func(p, x, y): return func(p,x)-y p0 = [0,0] Para = leastsq(error_func, p0, args = (X, Y)) k, b = Para[0] print("k=",k,"b=",b) plt.figure(figsize=(10,6)) plt.scatter(X,Y,color="green",label=u"评分分布",linewidth=2) x=np.linspace(0,30,20) y=k*x+b plt.plot(x,y,color="red",label=u"回归方程直线",linewidth=2) plt.title("电影排名和评分关系图") plt.xlabel(‘排名‘) plt.ylabel(‘评分‘) plt.legend() plt.show() main() 复制代码 复制代码 #绘制一元二次回归方程 def one(): colnames = ["排名", "电影名", "评分", "介绍"] df = pd.read_csv(‘豆瓣电影数据.csv‘,skiprows=1,names=colnames) X = df.排名 Y = df.评分 def func(p,x): a,b,c=p return a*x*x+b*x+c def error_func(p,x,y): return func(p,x)-y p0=[0,0,0] Para=leastsq(error_func,p0,args=(X,Y)) a,b,c=Para[0] plt.figure(figsize=(10,6)) plt.scatter(X,Y,color="green",label=u"评分分布",linewidth=2) x=np.linspace(0,30,20) y=a*x*x+b*x+c plt.plot(x,y,color="red",label=u"拟合直线",linewidth=2) plt.title("电影排名和评分一元二次回归方程关系图") plt.legend() plt.show() one() 复制代码 5.将以上各部分的代码汇总,附上完整程序代码: 复制代码 1 import requests 2 from bs4 import BeautifulSoup 3 import pandas as pd 4 from sklearn.linear_model import LinearRegression 5 import seaborn as sns 6 import numpy as np 7 import matplotlib.pyplot as plt 8 import matplotlib 9 from scipy.optimize import leastsq 10 11 def get_html(url): 12 headers = {‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362‘}#伪装爬虫 13 resp = requests.get(url, headers = headers) 14 return resp.text 15 16 url = ‘https://movie.douban.com/top250‘ 17 html = get_html(url) 18 soup = BeautifulSoup(html, ‘html.parser‘) 19 20 21 a = soup.find_all(‘div‘, class_=‘hd‘) 22 #电影名 23 film_name = [] 24 for i in a: 25 film_name.append(i.a.span.text) 26 27 #评分 28 rating_score = soup.find_all(‘span‘, class_=‘rating_num‘) 29 30 #介绍 31 introduce = soup.find_all(‘span‘, class_=‘inq‘) 32 33 lt = [] 34 num = 20 35 for i in range(num): 36 lt.append([i+1,film_name[i], rating_score[i].string, introduce[i].string]) 37 df = pd.DataFrame(lt,columns = [‘排名‘, ‘电影名‘, ‘评分‘, ‘介绍‘]) 38 df.to_csv(‘豆瓣电影数据.csv‘) #保存文件,数据持久化 39 40 #读取csv文件 41 df = pd.DataFrame(pd.read_csv(‘豆瓣电影数据.csv‘)) 42 #print(df) 43 df.head() 44 45 46 #删除无效列与行 47 48 df.drop(‘介绍‘, axis=1, inplace = True) 49 df.head() 50 51 #检查是否有重复值 52 df.duplicated() 53 54 #空值处理 55 df.isnull().sum()#返回0,表示没有空值 56 57 #缺失值处理 58 df[df.isnull().values==True]#返回无缺失值 59 60 #用describe()命令显示描述性统计指标 61 df.describe() 62 63 #数据分析 64 X = df.drop("电影名",axis=1) 65 predict_model = LinearRegression() 66 predict_model.fit(X,df[‘评分‘]) 67 print("回归系数为:",predict_model.coef_) 68 69 70 #绘制排名与评分的回归图 71 plt.rcParams[‘font.sans-serif‘]=[‘STSong‘]#显示中文 72 sns.regplot(df.排名,df.评分) 73 74 # 绘制垂直柱状图 75 plt.rcParams[‘axes.unicode_minus‘]=False #用来正常显示负号 76 plt.bar(df.排名, df.评分, label="排名与评分柱状图") 77 plt.show() 78 79 # 绘制散点图 80 def Scatter_point(): 81 82 plt.scatter(df.排名, df.评分, color=‘red‘, s=25, marker="o") 83 plt.xlabel("排名") 84 plt.ylabel("评分") 85 plt.title("排名与评分-散点图") 86 plt.show() 87 88 Scatter_point() 89 90 #绘制排名与评分-折线图 91 def draw(): 92 93 x = df[‘排名‘] 94 y = df[‘评分‘] 95 plt.xlabel(‘排名‘) 96 plt.ylabel(‘评分‘) 97 plt.plot(x,y) 98 plt.scatter(x,y) 99 plt.title("绘制排名与评分折线图") 100 plt.show() 101 102 draw() 103 104 #绘制排名与评分-箱体图(盒图) 105 def draw1(): 106 107 plt.figure(figsize=(10, 6)) 108 plt.title(‘绘制排名与评分-箱体图‘) 109 sns.boxplot(x=‘排名‘,y=‘评分‘, data=df) 110 111 draw1() 112 113 #绘制部分分布图 114 sns.jointplot(x="排名",y=‘评分‘,data = df, kind=‘kde‘, color=‘r‘) 115 116 sns.jointplot(x="排名",y=‘评分‘,data = df) 117 118 sns.jointplot(x="排名",y=‘评分‘,data = df, kind=‘reg‘) 119 120 sns.jointplot(x="排名",y=‘评分‘,data = df, kind=‘hex‘) 121 122 123 #绘制一元一次回归方程 124 def main(): 125 126 colnames = ["排名", "电影名", "评分", "介绍"] 127 df = pd.read_csv(‘豆瓣电影数据.csv‘,skiprows=1,names=colnames) 128 X = df.排名 129 Y = df.评分 130 131 def func(p, x): 132 k, b = p 133 return k * x + b 134 135 def error_func(p, x, y): 136 return func(p,x)-y 137 p0 = [0,0] 138 139 Para = leastsq(error_func, p0, args = (X, Y)) 140 k, b = Para[0] 141 print("k=",k,"b=",b) 142 143 plt.figure(figsize=(10,6)) 144 plt.scatter(X,Y,color="green",label=u"评分分布",linewidth=2) 145 x=np.linspace(0,30,20) 146 y=k*x+b 147 plt.plot(x,y,color="red",label=u"回归方程直线",linewidth=2) 148 149 plt.title("电影排名和评分关系图") 150 plt.xlabel(‘排名‘) 151 plt.ylabel(‘评分‘) 152 plt.legend() 153 plt.show() 154 155 main() 156 157 158 #绘制一元二次回归方程 159 def one(): 160 161 colnames = ["排名", "电影名", "评分", "介绍"] 162 df = pd.read_csv(‘豆瓣电影数据.csv‘,skiprows=1,names=colnames) 163 X = df.排名 164 Y = df.评分 165 166 def func(p,x): 167 a,b,c=p 168 return a*x*x+b*x+c 169 170 def error_func(p,x,y): 171 return func(p,x)-y 172 173 p0=[0,0,0] 174 Para=leastsq(error_func,p0,args=(X,Y)) 175 a,b,c=Para[0] 176 plt.figure(figsize=(10,6)) 177 plt.scatter(X,Y,color="green",label=u"评分分布",linewidth=2) 178 179 x=np.linspace(0,30,20) 180 y=a*x*x+b*x+c 181 plt.plot(x,y,color="red",label=u"拟合直线",linewidth=2) 182 plt.title("电影排名和评分一元二次回归方程关系图") 183 plt.legend() 184 plt.show() 185 186 one() 复制代码 四、结论 1.结论:经过对主题数据的分析与可视化,突出了各数据间的关系和各数据呈现出来的分布,让数据分析变的容易起来,解决了大部分人工计算绘图等繁杂过程。 2.小结:通过这次做题任务,我明白了数据的分析与可视化,掌握了不少库的使用,期间有在百度上等地方进行学习,此次任务有所收获,加深了对python的热爱。
以上是关于爬取电影 Top 500 数据的主要内容,如果未能解决你的问题,请参考以下文章