最近呢,接到一个项目:
项目内容:
1.利用Python编写爬虫程序,爬取https://ncov.dxy.cn/ncovh5/view/pneumonia页面中当天的“疫情数据”并保存到本地
2.根据爬取的数据可视化展示
项目实现
很显然,该项目分为两个部分:
- 使用爬虫获取数据(request,beautifulsoup,pyquery……)
- 进行数据可视化(pyecharts,matplotlib……)
我们进入该网址使用快捷键F12浏览源代码
经过漫长的寻找我们找到了所需要的数据:
经过整理,我们发现它的数据是这样的:
[{ {“provinceName”:“黑龙江省”,“provinceShortName”:“黑龙江”,“currentConfirmedCount”:408,“confirmedCount”:930,“suspectedCount”:384,“curedCount”:509,“deadCount”:13,“comment”:"",“locationId”:230000,“statisticsData”:“https://file1.dxycdn.com/2020/0223/643/3398299753820971199-135.json”,"cities":[{ “cityName”:“境外输入”,“currentConfirmedCount”:347,“confirmedCount”:386,“suspectedCount”:34,“curedCount”:39,“deadCount”:0,“locationId”:0},{…………},{…………},{…………}………}………………]
所以,经过观察得知它是把所有省的信息整合成一个字典,把这些字典并称一个列表;
在省的字典里不仅包含了省的信息还包含了一对键值对——“cities”:[],就是说它把所有该省的城市的信息整合成一个列表,作为键(cities)的对应值;
而在这个列表中,包含着所有的城市的信息是以字典的凡是存储在该列表中的;
再观察这个字典可以知道,它不仅包含了城市名字的键值对(cityName),还包含着
currentConfirmedCount(现存确诊人数),
confirmedCount(累计确诊人数),
suspectedCount(疑似人数),
curedCount(治愈人数),
deadCount(死亡人数),
locationId(地区代码)
————————————————————————
这样我们就可以通过方法获取信息了,详见下面代码
我们一边看代码一边讲:
这里我们先导入模块:
import requests
from pyquery import PyQuery as pq
import json
import pandas as pd
import time
import matplotlib.pyplot as plt
from matplotlib.pyplot import savefig
部分模块后面会用到
然后呢我们使用requests库获得源码:
url = "https://ncov.dxy.cn/ncovh5/view/pneumonia"
response = requests.get(url)
if response.status_code == 200:
response.encoding = "utf-8"
然后呢我们对其进行格式化并获取json对象
dom = pq(response.content)
data = dom("script#getAreaStat").text().split(" = ")[1].split("}catch")[0]
jsonobj = json.loads(data)
注意:
我们这里只是获取了全国省份的信息并没有获取城市的信息
(如果不会pyquery可参考https://www.jianshu.com/p/770c0cdef481)
随后我们获取城市信息:
for shengfen in jsonobj:
chengshi[shengfen.get('provinceName')] = shengfen.get('cities')
我们获取了cities所对应的值(一个包含着数个字典的列表)
for v in chengshi.keys():
cities_data = []
for item in chengshi.get(v):
dic = {
}
dic["城市名字"] = item["cityName"]
dic["现存确诊人数"] = item["currentConfirmedCount"]
dic["累计确诊人数"] = item["confirmedCount"]
dic["疑似人数"] = item["suspectedCount"]
dic["治愈人数"] = item["curedCount"]
dic["死亡人数"] = item["deadCount"]
cities_data.append(dic)
#获取对应键值对
if (cities_data.__len__() > 0):