Python網絡爬蟲———現存疫情數據爬取及分析


一、選題的背景

為什么要選擇此選題?

 

由於疫情原因的影響,世界各地都因為新型冠狀病毒(簡稱新冠肺炎)而陷入種種危機。因此,對於現存國內的疫情數據我進行了一個爬取和一些數據分析,更加直觀的查看出國內現存疫情的情況。

 

讓現在在社會上經常流通的人們加強防范意識,了解現存哪些地區風險較高,出行進行防護。在外出差、走生意的人也更加了解到各地的疫情情況,盡量避免高危地區出行!

 

數據來源:一點資訊。

 

網址: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有關的知識,強化自身,以后為程序設計行業提供像擎天柱一樣的大山。

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM