Python使用Selenium和Pyecharts绘制疫情地图实战
本文介绍如何利用Python的Selenium库解决JavaScript渲染页面的数据抓取问题,获取实时确诊人数,并结合Pyecharts库将数据转化为交互式地图。文章详细讲解了ChromeDriver配置、页面等待机制及正则表达式提取数据的具体步骤,最后通过完整代码展示如何生成可视化图表。
疫情地图可视化背景与目标
近期疫情发展态势引人关注。鉴于pyecharts库在可视化方面的优势,尝试抓取疫情实时播报官网数据并制作地图展示。
使用Selenium抓取动态数据
首先进行数据抓取,发现网页源代码中未直接包含各省确诊人数,这是由JavaScript动态渲染生成的。通过查阅资料,确定使用Selenium模拟浏览器渲染过程来获取数据,需先安装该库。
pip install selenium
使用Selenium需要调用webdriver启动浏览器,以Google Chrome为例,需下载对应的chromedriver。首先需确认本地Chrome浏览器的版本号。

根据Chrome版本找到匹配的chromedriver版本并进行下载。

将下载的exe文件解压至代码编写目录即可使用。随后开始编写爬虫代码,导入必要的库文件。
from selenium import webdriver
初始化浏览器驱动并访问目标网址。
driver = webdriver.Chrome()
driver.get('https://news.163.com/special/epidemic/#map_block')
务必设置隐式等待时间,否则程序可能在网页完全加载前就执行后续操作,导致数据获取失败。
driver.implicitly_wait(5)
等待页面加载完成后,即可获取页面源码数据。
data = driver.page_source
利用正则表达式从HTML源码中筛选出所需的关键数据,记得提前导入re模块。
name = re.findall(r'<span class="item_name">(.*?)</span>',data,re.S)[1:32]
value = re.findall(r'span class="item_confirm">(.*?)</span>',data,re.S)[1:32]
数据抓取流程顺利完成。

利用Pyecharts绘制地图
获取数据后进入可视化阶段,使用pyecharts中的Map模块进行地图绘制。
参考pyecharts官方文档链接,按照文档指引导入相关库。

具体的地图绘制代码如下。

若遇到Faker库下载失败的问题,可参考文中提供的大佬解决方案链接。
完整的实现代码如下所示。
from pyecharts.charts import Map
from pyecharts import options as opts
import re
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://news.163.com/special/epidemic/#map_block')
driver.implicitly_wait(5)
#data = driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/ul[1]/li[1]/div/span[1]').text#.get_attribute('href')
data = driver.page_source
attr = re.findall(r'<span class="item_name">(.*?)</span>',data,re.S)[1:32]
value = re.findall(r'span class="item_confirm">(.*?)</span>',data,re.S)[1:32]
sequence = list(zip(attr, value))
def map_visualmap(sequence, year) -> Map:
c = (
Map()
.add(year, sequence, "china", )
.set_global_opts(
title_opts=opts.TitleOpts(title="新冠装状病毒各省确诊人数"),
visualmap_opts=opts.VisualMapOpts(max_=130, min_=95),
)
)
return c
map = map_visualmap(sequence, '新冠病毒感染情况')
map.render(path='2020.html')
查看最终生成的可视化成果。
以上内容为本站小编整理的完整教程,感谢大家的学习和支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













