2019-2020-2 《Python程序設計》實驗四報告
課程:《Python程序設計》
班級:1924
姓名:王麥齊
學號:20192401
實驗教師:王志強
實驗日期:2020年4月12日
必修/選修: 公選課
1.實驗內容
-
1>使用爬蟲爬取【網易新聞 肺炎疫情實時動態播報】頁面信息。
(https://wp.m.163.com/163/page/news/virus_report/index.html?nw=1&anw=1)
-
2>將爬取的數據存儲為csv格式文件。
-
3>讀取csv文件,對數據進行相應的處理。
-
4>對處理后的數據進行可視化分析。
2.實驗過程及結果
1>找到目標網址,偽裝瀏覽器,請求數據
(1)通過響應network找到數據源如下:
(https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=317836035959#)
(2)偽裝瀏覽器,headers如下:
(headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'})
(3)使用requests庫對目標網址進行請求,打印響應碼:
(4)打印響應內容:
2>使用Json模塊對響應內容進行初步解析
(1)data_json = json.loads(req.text) #使用json.loads將json字符串轉化為字典
(2)打印字典的key值
可以看到我們需要的是其中的data數據,再次打印data查看結果。
有點混亂,可以看到其仍然為字典,再次打印data的key值,得到關鍵信息。
前兩個和中國有關,第3、4個和更新時間有關,最后一個不太確定是啥,打印再看看。
這次我們可以看到出現了很多國家的名字,按照猜測應該是對應網頁這塊:
接下來我們將對這塊數據進行分析處理並可視化。
(3)使用PrettyPrinter打印字典(PrettyPrinter格式化輸出字典)
可以看到areaTree的數據格式是list,里面每一個國家對應一個字典,而字典中又嵌套着字典。
3>世界各國實時數據爬取
(1)獲取areaTree數據
areaTree = data['areaTree']
(2)獲取數據
today_world = get_data(areaTree,['id','lastUpdateTime','name']) #調用封裝的函數獲取數據
查看前5行
(3)存儲數據
save_data(today_world,'today_world') #調用函數保存數據
4>數據處理
(1)更換數據列名
將英文列名換為中文列名方便我們理解數據進行處理。
使用drop()方法刪除Unnamed: 0列,使用describe()方法查看對數據的描述:
計算【當日現存確診】公式為:累計確診-累計治愈-累計死亡
計算【病死率】公式為:累計死亡/累計確診
通過數據描述可以發現NaN值特別多,那么我們可以計算一下每一列NaN值占多少。
使用isnull()方法查看DataFrame數據的NaN值,並用sum()方法進行求和,除以總大小。
使用sort_values方法對DataFrame進行排序,排序方式以病死率,按降序方式,得到如下結果:
將索引改為國家名稱:
td_wd.set_index('名稱',inplace=True)
並按累計確診進行再次排序,取出['累計確診','累計死亡','病死率']三列前10賦給新的變量:
5>數據可視化
(1)從matplotlib可視化庫中導入pyplot
(2)指定plt.rcParams['font.sans-serif'] = ['SimHei'] #防止中文亂碼
(3)按照病死率對10位數據進行排序,並將['累計確診','累計死亡','病死率']三列分別作為每一張子圖,得到可視化結果。
(4)同樣的,爬取最近幾月內歷史數據。需要執行 2>——4>步
經過適當處理后得到如下結果:
可以看到一個國家對應最近倆月不同的行,這種數據結構不易處理,再將其國家名稱作為key值,存儲每一天的數據。
for i in ac.index:
name = ac['名稱'][i]
if name not in hisc.keys():
hisc[name] = []
hisc[name].append(list(ac.loc[i]))
else:
hisc[name].append(list(ac.loc[i]))
循環讀取數據的每一行,判斷當前行國家名在此字典key值是否存在,如果存在直接添加數據,不存在則創建值空列表再添加當前行數據。
查看數據以后,發現不同國家之間爬取到的數據是存在缺失值的,我們將不存在的日期去除,只保留當前所有國家存在日期的交集:
for i in cn:
d += 1
if d==1:
p_a = ds1[i]
continue
else:
p_b = ds1[i]
p_a = set(p_a) & set(p_b)
cn為國家名稱(由於數據太多,表現效果不是很理想,故只取病死率前5國家作為可視化分析的依據)
(5)當日新增確診趨勢
由於橫坐標軸顯示問題,將其文本旋轉60°,由於太過密集的原因,再將其設置為間隔顯示。
(6)當日新增確認趨勢
(7)當日新增死亡
(8)病死率趨勢
(9)當日累計治愈
3.成果分析
從以上數據可以看到也門人口基數少,但卻是病死率最高的國家。法國新增確診波動比較大,可能是由於政策上的原因導致疫情二次擴散,同時也門有逐漸減少的趨勢。意大利每天的治愈量非常大,有可能是因為人口基數的原因,同時也說明了治療肺炎的能力也在前面。
意大利的死亡人數有減緩趨勢,而法國在四月中旬波動比較大,在5月中旬趨於平緩說明法國已經在這場肺炎疫情趨勢中有所好轉。
從累計治愈人數來看,意大利>法國>比利時>聖馬丁島>也門
(155633>68268>15769>60>13)
3.實驗過程中遇到的問題和解決過程
1>爬蟲爬取數據
解決:通過network找到真實數據地址
2>數據處理
解決:DataFrame雖然好用但不是非常靈活,配合字典和列表構成新的數據格式,可以繪制出想要的可視化效果
3>數據缺失值處理
解決:對所有缺失值數據進行行刪除,以此清洗后得到有效的數據。
4.結課總結:
通過課程的學習,我學習到了python如何使用,python語言的發展歷史。學習到了流程控制語句:if-elif-else語句(elif else 可選)、for/while循環。學習到了序列如何應用、字符串與正則表達式如何實際去應用以及相關之間的關系。第六課學習到了函數如何編寫,第7課學習了面向對象編程,萬物皆為對象。第8課學習了異常處理,是為了防止錯誤中斷程序使程序更加的健壯。第9課學習了數據庫,python如何操作數據庫,還學習到了一些簡單的控制數據庫語句。第10課學習了爬蟲,對本次實驗來說,實現並且應用!
5.課程感想體會:
通過本次課程學習,掌握了許多編程技巧。在不斷進步的過程中,收獲了許多新的知識。總之非常感謝老師的教導,而且本課程實用性也非常好,對於以后不懂編程很難混有極大的科普價值,當然也有一定的實用性!
碼雲鏈接:
[源代碼]: https://gitee.com/wangmaiqi/untitled/commit/0ae33729b751df81538581eac47d892cd5a81ed3
參考資料
- [Python網絡數據采集(https://www.ituring.com.cn/book/1709)]
- [Python數據分析:活用Pandas庫(https://www.ituring.com.cn/book/2557)]
- [Python3 教程(https://www.w3cschool.cn/python3/)]
- [Python 基礎教程(https://www.runoob.com/python/python-tutorial.html)]