Python网络爬虫———现存疫情数据爬取及分析

时间:2024-03-10 16:31:56

一、选题的背景

为什么要选择此选题?

 

由于疫情原因的影响,世界各地都因为新型冠状病毒(简称新冠肺炎)而陷入种种危机。因此,对于现存国内的疫情数据我进行了一个爬取和一些数据分析,更加直观的查看出国内现存疫情的情况。

 

让现在在社会上经常流通的人们加强防范意识,了解现存哪些地区风险较高,出行进行防护。在外出差、走生意的人也更加了解到各地的疫情情况,尽量避免高危地区出行!

 

数据来源:一点资讯。

 

网址:24小时滚动播报全国最新疫情 (yidianzixun.com)

 

 

二、主题式网络爬虫设计方案

1.主题式网络爬虫名称

Python网络爬虫———现存疫情数据爬取及分析  

 

2.主题式网络爬虫爬取的内容与数据特征分析

 

爬取现存疫情数据并进行绘图

 

3.主题式网络爬虫设计方案概述

 

先确定主题,爬取现存疫情数据,设计爬取程序进行爬取,并以csv形式储存,然后利用pandas库进行数据分析和清洗,再利用Matplotlibseaborn等库进行图形图像绘制。最后保存数据。

 

三、主题页面的结构特征分析

 

1.主题页面的结构与特征分析

 

首页与信息集

 

 

 

 

 

 

 

 

 2.Htmls 页面解析

 

数据集页面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有关的知识,强化自身,以后为程序设计行业提供像擎天柱一样的大山。