说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
用 Python 编写爬虫时,目标网站服务器返回的已经是渲染后的html代码,直接进行解析可得到信息,还有一类网站采用了前后端分离的架构模式,查看源码时无法看到想到获取的数据,因为这部分数据以接口(API)的形式返回。标准的API返回的都是JSON格式数据,JSON是一个互联网数据传输标准格式,由字典和列表形式组成,Pandas的pd.read_json()可以读取和解析JSON格式。
本例我们通过腾讯网疫情专题页( https://news.qq.com/zt2020/page/feiyan.htm )获取最新的各国死亡人数。打开网页,右击利用浏览器的检查元素(Inspect)重新加载网站找到了此数据的相关API网址:https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist, 爬虫访问此链接后解析其中的JSON内容。
import pandas as pd
import requests # 安装 pip install requests
s = requests.Session()
# 访问数据
covid19 = s.get('https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist')
# 数据文本
j_data = covid19.text
# 读取解析JSON
pd.read_json(j_data).data
'''
0 {'name': '美国', 'continent': '北美洲', 'date': '11...
1 {'name': '印度', 'continent': '亚洲', 'date': '11....
2 {'name': '巴西', 'continent': '南美洲', 'date': '11...
3 {'name': '法国', 'continent': '欧洲', 'date': '11....
4 {'name': '俄罗斯', 'continent': '欧洲', 'date': '11...
...
180 {'name': '老挝', 'continent': '亚洲', 'date': '11....
181 {'name': '圣基茨和尼维斯', 'continent': '北美洲', 'date'...
182 {'name': '所罗门群岛', 'continent': '大洋洲', 'date': ...
183 {'name': '瓦努阿图', 'continent': '大洋洲', 'date': '...
184 {'name': '马绍尔群岛', 'continent': '大洋洲', 'date': ...
Name: data, Length: 185, dtype: object
'''
# 筛选国家和死亡人数
data = [(i['name'],i['dead']) for i in pd.read_json(j_data).data]
data
'''
[('美国', 254255),
('印度', 130519),
('巴西', 166699),
('法国', 46346),
('俄罗斯', 33619),
('西班牙', 41688),
('英国', 52839),
('阿根廷', 36106),
('意大利', 46464),
...
...
('所罗门群岛', 0),
('瓦努阿图', 0),
('马绍尔群岛', 0)]
'''
# 加载
df = pd.DataFrame(data, columns=['国家', '死亡人数'])
df
'''
国家 死亡人数
0 美国 254255
1 印度 130519
2 巴西 166699
3 法国 46346
4 俄罗斯 33619
.. ... ...
180 老挝 0
181 圣基茨和尼维斯 0
182 所罗门群岛 0
183 瓦努阿图 0
184 马绍尔群岛 0
[185 rows x 2 columns]
'''
注:以上网站可能会改版,代码不适用时需要调整爬虫代码。
更新时间:2024-08-18 16:30:13 标签:python pandas 新冠疫情 json