python爬取百度疫情数据(用python爬取疫情数据)
「Python」使用Pyecharts生成疫情分布地图
最近受江苏疫情影响,好多小伙伴都居家办公咯!为了密切关注疫情动态,最近写了爬取疫情分布的脚本,参考上篇链接。
既然我们已经获得了相应的江苏各个地级市的疫情数据,那么我们如何来使用Python实现将数据可视化在地图上呢?
Apache Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。
简单来说,pyecharts具有以下特性:
3. Pyecharts 安装
使用pip进行安装如下:
因为我们需要使用pycharts绘制地图,此时我们还需要安装相应的地图文件包:
其中:
echarts-countries-pypkg 包为全球国家地图
echarts-china-provinces-pypkg包为中国省级地图
echarts-china-cities-pypkg 包为中国市级地图
安装完上述绘制地图相关的python包后,我们接下来开始画疫情分布地图。
首先,我们先来查看一段Pyecharts相关实现:
上述代码解释如下:
运行后会在当前目录生成 map_jiangsu_0803.html,用浏览器打开后结果如下:
当鼠标移动到对应区域后,会显示出对应地级市今日新增人数。
上述脚本虽然可以实现我们的功能,但是颜色灰灰的,太过于单调,接下来我们来想办法进行美化,实现代码如下:
代码解释如下:
运行后会在当前目录生成 map_jiangsu_0803_new.html,用浏览器打开后结果如下:
同理我们可以得到现有确诊人数分布如下:
进而我们可以得到累计确诊人数分布如下:
怎么使用python爬取百度网的数据
档案系统初期算是告一段落了,利用一点时间继续爬取POI。和领导聊聊,受益匪浅。之前我的想法是爬取一份poi数据,直接能用;而领导听了之后,觉得更好的方式是爬取多个渠道来源的POI数据,然后做一个数据比较融合(最终事情能不能成不好说,但是经过这么一回,细节技术上有所提高,宏观把控整体项目流程能力有所长进,更重要的是通过和能人交流,以更高的眼界更宏观的看待数据、应用以及问题,这就是成长)。 我之前采用的方式,可以满足需求,但是POI数据获取效率差一些(虽然已经很快,但是相比本文这种还是慢一些)、数据现势性不好,高德数据和百度数据虽然是两套,但是仅仅是坐标不同(所以显然还是一套)。所以,我加一种方式来爬取百度poi。
一 调研: 百度API提供了一个叫Place API获取poi的接口,有个城市内检索 实例为
ce/v2/search?query=银行page_size=10page_num=0scope=1region=北京output=jsonak={您的密钥}
它返回的是个json类型数据,一个区域最大返回数为400,每页最大返回数为20。显然一个城市内不管什么类别的poi,不可能只有400个,会遗漏数据,故舍去
还有一个矩形区域检索,实例为
u.com/place/v2/search?query=美食page_size=10page_num=0scope=1bounds=39.915,116.404,39.975,116.414output=jsonak={您的密钥}只要区域划分得当,这个可以使用
二 要解决的问题
1 区域划分
网上有人通过递归写代码的方式来划分,这样划分有问题,第一,划分的区域不能完全对应一个城市的市区;第二,算法设计比较麻烦。解决办法,后面详细说。
2 类别问题
百度API的接口必须要指定query的类别,那么如果类别指定不准,或者类别不全,根本无法完成爬取一个城市所有poi的任务。解决办法,说实话,这个问题在我做这件事情的时候,
十分棘手,不过我最终找到了这个网页
/index.php?title=lbscloud/poitags,一切都不是问题了
三 整体流程
1 区域划分,2km*2km的区域基本可以满足需求,获取每个区域的对角坐标(经纬度),逐行写入一个txt文本里
2 爬虫程序编写 读取1中的txt文本,逐行循环;调用百度API接口,爬取json;将爬取的数据存入数据库中; 每个类别跑一次程序
3 爬下的POI数据处理 poi显示,投影坐标转换,与地图叠加
后文将详细介绍流程
怎样用python爬取疫情数据
import requests
from bs4 import BeautifulSoup
import re
import json
# 1.发送请求,获取疫情首页(数据来源于丁香园)
response = requests.get('')
home_page = response.content.decode()
# 2.从疫情首页提取最近一日数据
soup = BeautifulSoup(home_page, 'lxml')
script = soup.find(id='getAreaStat')
text = script.string
# 3.提取数据获取json格式数据
json_str = re.findall(r'\[.+\]', text)[0]
# 4.把json格式转换为python类型
last_day_corona_virus = json.loads(json_str)
# 5.以json格式保存最近一日数据
with open('data/last_day_coronavirus.json', 'w') as fp:
json.dump(last_day_corona_virus, fp, ensure_ascii=False)