一、选题的背景
为什么要选择此选题?
由于疫情原因的影响,世界各地都因为新型冠状病毒(简称新冠肺炎)而陷入种种危机。因此,对于现存国内的疫情数据我进行了一个爬取和一些数据分析,更加直观的查看出国内现存疫情的情况。
让现在在社会上经常流通的人们加强防范意识,了解现存哪些地区风险较高,出行进行防护。在外出差、走生意的人也更加了解到各地的疫情情况,尽量避免高危地区出行!
数据来源:一点资讯。
网址:24小时滚动播报全国最新疫情 (yidianzixun.com)
二、主题式网络爬虫设计方案
1.主题式网络爬虫名称
Python网络爬虫———现存疫情数据爬取及分析
2.主题式网络爬虫爬取的内容与数据特征分析
爬取现存疫情数据并进行绘图
3.主题式网络爬虫设计方案概述
先确定主题,爬取现存疫情数据,设计爬取程序进行爬取,并以csv形式储存,然后利用pandas库进行数据分析和清洗,再利用Matplotlib与seaborn等库进行图形图像绘制。最后保存数据。
三、主题页面的结构特征分析
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有关的知识,强化自身,以后为程序设计行业提供像擎天柱一样的大山。