一、选题的背景
为什么要选择此选题?
由于疫情原因的影响,世界各地都因为新型冠状病毒(简称新冠肺炎)而陷入种种危机。因此,对于现存国内的疫情数据我进行了一个爬取和一些数据分析,更加直观的查看出国内现存疫情的情况。
让现在在社会上经常流通的人们加强防范意识,了解现存哪些地区风险较高,出行进行防护。在外出差、走生意的人也更加了解到各地的疫情情况,尽量避免高危地区出行!
数据来源:一点资讯。
网址:24小时滚动播报全国最新疫情 (yidianzixun.com)
二、主题式网络爬虫设计方案
1.主题式网络爬虫名称
Python网络爬虫———现存疫情数据爬取及分析
2.主题式网络爬虫爬取的内容与数据特征分析
爬取现存疫情数据并进行绘图
3.主题式网络爬虫设计方案概述
先确定主题,爬取现存疫情数据,设计爬取程序进行爬取,并以csv形式储存,然后利用pandas库进行数据分析和清洗,再利用Matplotlib与seaborn等库进行图形图像绘制。最后保存数据。
三、主题页面的结构特征分析
1.主题页面的结构与特征分析
首页与信息集
页面解析
数据集页面Htmls定位
单条数据集Htmls定位
单个数据Htmls定位
四、网络爬虫程序设计
1.数据爬取与采集
1 #导入库
2 import requests
3 from lxml import etree
4 import time
5 import re
6 import pandas as pd
7
8 # 初始化空列表
9 dm_lis, xcqz_lis, ljqz_lis, zy_lis, sw_lis = [], [], [], [], []
10
11 #爬取网站的网址
12 url = "https://heytap.yidianzixun.com/article/0SosIrBo?__source__=yidian&s=heytap&appid=heytap2&__styleType__=3&expose_type=manual"
13
14 # 设置请求头
15 headers = {
16 "user - agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 91.0.4472.101Safari / 537.36Edg / 91.0.864.48"
17 }
18 # requests请求链接
19 responce = requests.get(url=url,headers=headers).text
20 # 使用lxml模块中的etree方法讲字符串转化为html标签
21 html = etree.HTML(responce)
22
23 # 用xpath定位标签位置
24 lis = html.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr')
25
26 # 获取要爬取内容的详情链接
27 for li in lis:
28 #爬取地区
29 dm = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[1]/text()')[0]
30 #爬取现存确诊
31 xcqz = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[2]/text()')[0]
32 #爬取累计确诊
33 ljqz = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[3]/text()')[0]
34 #爬取治愈人数
35 zy = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[4]/text()')[0]
36 #爬取死亡人数
37 sw = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[5]/text()')[0]
38
39 # 输出
40 print(dm)
41 print(xcqz)
42 print(ljqz)
43 print(zy)
44 print(sw)
45 # 将字段存入初始化的列表中
46 dm_lis.append(dm)
47 xcqz_lis.append(xcqz)
48 ljqz_lis.append(ljqz)
49 zy_lis.append(zy)
50 sw_lis.append(sw)
51
52 df = pd.DataFrame({
53 "地名": dm_lis,
54 "现存确诊": xcqz_lis,
55 "累计确诊": ljqz_lis,
56 "治愈": zy_lis,
57 "死亡": sw_lis,
58 })
59 #输出csv文件
60 df.to_csv("yiqingshuju.csv", encoding='utf_8_sig', index=False)
爬取成功后会在当前文件路径下输出一个csv文件
2.对数据进行清洗和处理
(1)先导入数据集
1 #导入库
2 import numpy as np
3 import pandas as pd
4 import matplotlib.pyplot as plt
5 import seaborn as sns
6 import matplotlib.pyplot as plt
7 import seaborn as sns
8 # 导入数据集
9
10 yqfx = pd.DataFrame(pd.read_csv('yiqingshuju.csv'))
11
12 yqfx.head()
显示截图
(2)查看统计信息,了解大致特征
1 #查看统计信息,了解大致特征
2 yqfx.describe()
显示截图
(3)空值与缺失值处理
1 #空值与缺失值处理
2 yqfx['地区'].isnull().value_counts()
效果截图
(4)删除重复值
1 #删除重复值
2 yqfx.duplicated()
3 yqfx=yqfx.drop_duplicates()
4 yqfx.head()
效果代码
3.数据分析与可视化
(1)绘制各地数据的折现图
1 #导入库
2 import numpy as np
3 import matplotlib.pyplot as plt
4 import csv
5 import pandas as pd
6
7 #绘制折线图
8 data = pd.DataFrame(pd.read_excel('yiqingshuju.csv'))
9 plt.rcParams['font.sans-serif'] = ['SimHei']
10 plt.rcParams['font.family']='sans-serif'
11 plt.rcParams['axes.unicode_minus'] = False
12
13 fig=plt.figure(figsize=(15,10))
14
15
16 xdata=[]
17 ydata=[]
18 xdata=data.iloc[:,0]
19 ydata=data.iloc[:,3]
20 plt.plot(xdata,ydata)
21 plt.xlabel('地区')
22 plt.ylabel('治愈')
23 plt.title('全国各省治愈数量')
24 plt.show()
(2)绘制各地数据的直方图
全国现存确诊分布图
1 #提取地区
2 dq = np.array(yqsj['地区'])
3 #提取现存确诊
4 xcqz = np.array(yqsj['现存确诊'])
5
6 #绘制直方图
7
8 plt.figure(figsize=(15,10))
9
10 xdata=[]
11 ydata=[]
12 xdata=data.iloc[:,0]
13 ydata=data.iloc[:,1]
14
15 plt.xlabel("地区")
16 plt.ylabel("现存确诊")
17 plt.plot(xdata,ydata)
18 plt.bar(dq,xcqz,linewidth=5.0,label="各地现存确诊直方图")
19 plt.show()
全国累计确诊人数分布图
1 #提取地区
2 dq = np.array(yqsj['地区'])
3 #提取累计确诊
4 ljqz = np.array(yqsj['累计确诊'])
5
6 #绘制直方图
7
8 plt.figure(figsize=(15,10))
9
10 xdata=[]
11 ydata=[]
12 xdata=data.iloc[:,0]
13 ydata=data.iloc[:,2]
14
15 plt.xlabel("地区")
16 plt.ylabel("累计确诊")
17 plt.plot(xdata,ydata)
18 plt.bar(dq,ljqz,linewidth=5.0,label="各地累计确诊直方图")
19 plt.show()
全国治愈人数分布图
1 #提取地区
2 dq = np.array(yqsj['地区'])
3 #提取治愈
4 zy = np.array(yqsj['治愈'])
5
6 #绘制直方图
7
8 plt.figure(figsize=(15,10))
9
10 xdata=[]
11 ydata=[]
12 xdata=data.iloc[:,0]
13 ydata=data.iloc[:,3]
14
15 plt.xlabel("地区")
16 plt.ylabel("治愈")
17 plt.plot(xdata,ydata)
18 plt.bar(dq,zy,linewidth=5.0,label="治愈")
19 plt.show()
全国死亡人数分布图
1 #提取地区
2 dq = np.array(yqsj['地区'])
3 #提取死亡
4 sw = np.array(yqsj['死亡'])
5
6 #绘制直方图
7
8 plt.figure(figsize=(15,10))
9
10 xdata=[]
11 ydata=[]
12 xdata=data.iloc[:,0]
13 ydata=data.iloc[:,4]
14
15 plt.xlabel("地区")
16 plt.ylabel("死亡")
17 plt.plot(xdata,ydata)
18 plt.bar(dq,sw,linewidth=5.0,label="死亡")
19 plt.show()
(3)绘制全国各省治愈人数饼状图
1 #各个省的治愈人数百分比
2 fig = plt.figure()
3 #设置图形大小
4 plt.figure(figsize=(10, 25))
5 #画饼图
6 plt.pie(zy,labels=dq,autopct='%1.1f%%')
7 plt.title("各个省的确诊人数所占比重")
8
9 plt.show()
4.数据持久化
将数据进行保存和备份,以便后期进行修改和查阅。
5.代码汇总,完整程序代码
1 #导入库
2 import requests
3 from lxml import etree
4 import time
5 import re
6 import pandas as pd
7
8
9 # 初始化空列表
10
11 dm_lis, xcqz_lis, ljqz_lis, zy_lis, sw_lis = [], [], [], [], []
12
13
14 #爬取网站的网址
15
16 url = "https://heytap.yidianzixun.com/article/0SosIrBo?__source__=yidian&s=heytap&appid=heytap2&__styleType__=3&expose_type=manual"
17
18
19 # 设置请求头
20
21 headers = {
22 "user - agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 91.0.4472.101Safari / 537.36Edg / 91.0.864.48"
23 }
24
25
26 # requests请求链接
27
28 responce = requests.get(url=url,headers=headers).text
29 # 使用lxml模块中的etree方法讲字符串转化为html标签
30 html = etree.HTML(responce)
31
32
33 # 用xpath定位标签位置
34
35 lis = html.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr')
36
37
38 # 获取要爬取内容的详情链接
39
40 for li in lis:
41
42 #爬取地区
43 dm = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[1]/text()')[0]
44
45 #爬取现存确诊
46 xcqz = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[2]/text()')[0]
47
48 #爬取累计确诊
49 ljqz = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[3]/text()')[0]
50
51 #爬取治愈人数
52 zy = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[4]/text()')[0]
53
54 #爬取死亡人数
55 sw = li.xpath('//*[@id="preview-topic-container"]/div[3]/table/tbody/tr[1]/td[5]/text()')[0]
56
57
58
59
60 # 输出
61 print(dm)
62 print(xcqz)
63 print(ljqz)
64 print(zy)
65 print(sw)
66
67
68 # 将字段存入初始化的列表中
69
70 dm_lis.append(dm)
71 xcqz_lis.append(xcqz)
72 ljqz_lis.append(ljqz)
73 zy_lis.append(zy)
74 sw_lis.append(sw)
75
76 df = pd.DataFrame({
77 "地名": dm_lis,
78 "现存确诊": xcqz_lis,
79 "累计确诊": ljqz_lis,
80 "治愈": zy_lis,
81 "死亡": sw_lis,
82 })
83
84
85 df.to_csv("yiqingshuju.csv", encoding='utf_8_sig', index=False)
86
87
88
89
90 #导入库
91
92 import numpy as np
93 import pandas as pd
94 import matplotlib.pyplot as plt
95 import seaborn as sns
96 import matplotlib.pyplot as plt
97 import seaborn as sns
98 # 导入数据集
99
100 yqfx = pd.DataFrame(pd.read_csv('yiqingshuju.csv'))
101
102 yqfx.head()
103
104
105
106
107
108 #查看统计信息,了解大致特征
109 yqfx.describe()
110
111
112
113 #判断重复行
114 yqfx.duplicated()
115
116
117
118
119 #空值与缺失值处理
120 yqfx['地区'].isnull().value_counts()
121
122
123
124
125 #删除重复值
126 yqfx.duplicated()
127 yqfx=yqfx.drop_duplicates()
128 yqfx.head()
129
130
131
132
133 #导入库
134 import numpy as np
135 import matplotlib.pyplot as plt
136 import csv
137 import pandas as pd
138
139
140 #绘制折线图
141
142 data = pd.DataFrame(pd.read_excel('yiqingshuju.csv'))
143 plt.rcParams['font.sans-serif'] = ['SimHei']
144 plt.rcParams['font.family']='sans-serif'
145 plt.rcParams['axes.unicode_minus'] = False
146
147 #画布大小
148 fig=plt.figure(figsize=(15,10))
149
150
151 xdata=[]
152 ydata=[]
153 xdata=data.iloc[:,0]
154 ydata=data.iloc[:,3]
155 plt.plot(xdata,ydata)
156 plt.xlabel('治愈')
157 plt.ylabel('地区')
158 plt.title('全国各省确诊数量')
159 plt.show()
160
161
162
163
164 #提取地区
165
166 dq = np.array(yqsj['地区'])
167
168 #提取现存确诊
169
170 xcqz = np.array(yqsj['现存确诊'])
171
172 #绘制直方图
173
174 plt.figure(figsize=(15,10))
175
176 xdata=[]
177 ydata=[]
178 xdata=data.iloc[:,0]
179 ydata=data.iloc[:,1]
180
181 plt.xlabel("地区")
182 plt.ylabel("现存确诊")
183 plt.plot(xdata,ydata)
184 plt.bar(dq,xcqz,linewidth=5.0,label="各地现存确诊直方图")
185 plt.show()
186
187
188
189
190 #提取地区
191
192 dq = np.array(yqsj['地区'])
193
194 #提取累计确诊
195
196 ljqz = np.array(yqsj['累计确诊'])
197
198 #绘制直方图
199
200 plt.figure(figsize=(15,10))
201
202 xdata=[]
203 ydata=[]
204 xdata=data.iloc[:,0]
205 ydata=data.iloc[:,2]
206
207 plt.xlabel("地区")
208 plt.ylabel("累计确诊")
209 plt.plot(xdata,ydata)
210 plt.bar(dq,ljqz,linewidth=5.0,label="各地累计确诊直方图")
211 plt.show()
212
213
214
215
216 #提取地区
217
218 dq = np.array(yqsj['地区'])
219
220 #提取治愈
221
222 zy = np.array(yqsj['治愈'])
223
224 #绘制直方图
225
226 plt.figure(figsize=(15,10))
227
228 xdata=[]
229 ydata=[]
230 xdata=data.iloc[:,0]
231 ydata=data.iloc[:,3]
232
233 plt.xlabel("地区")
234 plt.ylabel("治愈")
235 plt.plot(xdata,ydata)
236 plt.bar(dq,zy,linewidth=5.0,label="治愈")
237 plt.show()
238
239
240
241
242 #提取地区
243 dq = np.array(yqsj['地区'])
244
245 #提取死亡
246 sw = np.array(yqsj['死亡'])
247
248 #绘制直方图
249
250 plt.figure(figsize=(15,10))
251
252 xdata=[]
253 ydata=[]
254 xdata=data.iloc[:,0]
255 ydata=data.iloc[:,4]
256
257 plt.xlabel("地区")
258 plt.ylabel("死亡")
259 plt.plot(xdata,ydata)
260 plt.bar(dq,sw,linewidth=5.0,label="死亡")
261 plt.show()
262
263
264
265
266 #各个省的治愈人数百分比
267 fig = plt.figure()
268 #设置图形大小
269 plt.figure(figsize=(10, 25))
270 #画饼图
271 plt.pie(zy,labels=dq,autopct='%1.1f%%')
272 plt.title("各个省的确诊人数所占比重")
273
274 plt.show()
五、总结
1、经过对主题数据的分析与可视化,我发现制图比单一的数据显示更为突出,可以直观的看到数据的某些地方的突出性,哪里的疫情最严重和哪些地方的疫情更轻微。
2、在完成此设计中,我学会了如何灵活的运用各种强大的第三方库,和pandas库、Matplotlib库、seaborn库等等的使用与安装。希望在今后的学习中,可以学习到更多的Python有关的知识,强化自身,以后为程序设计行业提供像擎天柱一样的大山。