标签:highlight head 变量 空值 plot 保存 parser params scribe
一.主题式网络主题式网络爬虫设计方案
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的热爱。
标签:highlight head 变量 空值 plot 保存 parser params scribe
原文地址:https://www.cnblogs.com/abcdefgh9/p/12757403.html