如何抓取包含所有疫情信息的API
- 以火狐浏览器为例,用火狐浏览器打开目标网站,按下F12进入web开发者模式,进入network模块并刷新网页:
在这里插入图片描述
- 按类型进行排序,找到json格式的文件,网站从服务器获取数据的方法为get,从而锁定了三个请求:
在这里插入图片描述
数据爬取
需要导入的包
import pandas as pd
import requests
import json
网站将所有信息以json的格式存在data这个变量中,先获取data变量的信息:
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
area = requests.get(url).json()
data = json.loads(area['data'])
获取最近一次的更新时间
update_time = data['lastUpdateTime']
获得各个国家疫情信息
all_counties = data['areaTree']
for country_data in all_counties:
print(country_data['name'])
中国
日本
新加坡
泰国
韩国
澳大利亚
美国
马来西亚
德国
越南
法国
加拿大
阿联酋
菲律宾
印度
意大利
英国
俄罗斯
尼泊尔
斯里兰卡
芬兰
瑞典
柬埔寨
比利时
西班牙
获取各个省市疫情情况
只分析国内疫情情况,可以写一个简单的if判断:
if country_data['name'] != '中国':
continue
else:
all_provinces = country_data['children'] # children包含了各个省的情况
两句逻辑连在一起
for country_data in all_counties:
if country_data['name'] != '中国':
continue
else:
all_provinces = country_data['children']
all_provinces[-1]
{'name': '西藏',
'children': [{'name': '地区待确认',
'total': {'confirm': 1, 'suspect': 0, 'dead': 0, 'heal': 0},
'today': {'confirm': 0, 'suspect': 0, 'dead': 0, 'heal': 0}}],
'total': {'confirm': 1, 'suspect': 0, 'dead': 0, 'heal': 0},
'today': {'confirm': 0, 'suspect': 0, 'dead': 0, 'heal': 0}}
获取相应的地级市疫情情况
获取地级市名称信息
for province_data in all_provinces:
province_name = province_data['name']
all_cities = province_data['children']
市区名称获取
all_cities[0]['name']
'地区待确认'
total是一个字典,里面包含了确诊,治愈,死亡的人数信息
all_cities[0]['total']
{'confirm': 1, 'suspect': 0, 'dead': 0, 'heal': 0}
利用for循环将所有信息存在一个空列表中
all_list = []
for province_data in all_provinces:
province_name = province_data['name']
all_cities = province_data['children']
for city_data in all_cities:
city_name = city_data['name']
city_total = city_data['total']
province_result = {'province': province_name, 'city': city_name,'update_time': update_time}
province_result.update(city_total)
all_list.append(province_result)
转换成dataframe数据结构
df = pd.DataFrame(all_list)
print(df.head())
city confirm dead heal province suspect update_time
0 武汉 10117 414 454 湖北 0 2020-02-06 15:04:04
1 孝感 1886 25 9 湖北 0 2020-02-06 15:04:04
2 黄冈 1807 29 60 湖北 0 2020-02-06 15:04:04
3 随州 834 9 9 湖北 0 2020-02-06 15:04:04
4 荆州 801 10 18 湖北 0 2020-02-06 15:04:04
数据保存
保存为csv文件
df.to_csv('data.csv', index=False,encoding="utf_8_sig")
结果展示
在这里插入图片描述
完整代码
import pandas as pd
import requests
import json
def get_data():
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
area = requests.get(url).json()
data = json.loads(area['data'])
update_time = data['lastUpdateTime']
all_counties = cn_data['areaTree']
all_list = []
for country_data in all_counties:
if country_data['name'] != '中国':
continue
else:
all_provinces = country_data['children']
for province_data in all_provinces:
province_name = province_data['name']
all_cities = province_data['children']
for city_data in all_cities:
city_name = city_data['name']
city_total = city_data['total']
province_result = {'province': province_name, 'city': city_name,'update_time': update_time}
province_result.update(city_total)
all_list.append(province_result)
df = pd.DataFrame(all_list)
df.to_csv('data.csv', index=False,encoding="utf_8_sig")
if __name__ == '__main__':
get_data()