一、選題的背景
為什么要選擇此選題?
由於疫情原因的影響,世界各地都因為新型冠狀病毒(簡稱新冠肺炎)而陷入種種危機。因此,對於現存國內的疫情數據我進行了一個爬取和一些數據分析,更加直觀的查看出國內現存疫情的情況。
讓現在在社會上經常流通的人們加強防范意識,了解現存哪些地區風險較高,出行進行防護。在外出差、走生意的人也更加了解到各地的疫情情況,盡量避免高危地區出行!
數據來源:一點資訊。
網址: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有關的知識,強化自身,以后為程序設計行業提供像擎天柱一樣的大山。