前言
selenium 是模拟人的操作进行爬虫的,比较好上手,本次用的是 selenium +火狐驱动,应该注意selenium、火狐、火狐驱动的版本问题,最好的办法是都用最新的,库安装用pip方法,火狐驱动下载地址:https://github.com/mozilla/geckodriver/releases
注意结合自己电脑版本安装,这里说一下我是64位的,但是最后用的geckodriver-v0.32.0-win32才成功,原因不知。安装好后将驱动解压,放在py同目录下。在运行过程中如果发现问题,搜索解决(废话)我遇到的问题是找不到浏览器、找不到驱动,最终都解决了。
本文章参考了CSDN前辈们的代码。
pip install selenium
目的及知识点
本次脚本的效果是实现自动爬取卫生健康委员会第一页至第九页所有链接中的疫情数据,想要获取的内容是大陆、香港、台湾2022年4月至11月的累计确诊人数、累计死亡人数。目的是为了计算死亡率的变化情况。
主要用到的知识点是:
- 通过 selenium 拉起网页、用browser.find_element、browser.find_elements方法查找链接和文本
- 通过正则表达式筛选对应文字
- 导出csv
code
初学者推荐用 jupyter notebook,方便代码调试
from selenium.webdriver import Firefox
from selenium.webdriver import FirefoxOptions
from selenium import webdriver
from selenium.webdriver.common.by import By
import time,re
import pandas as pd
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
# option = FirefoxOptions()
# option.add_argument("--headless") # 隐藏浏览器
binary = FirefoxBinary( r'C:\Program Files\Firefox\firefox.exe')
browser = webdriver.Firefox(firefox_binary=binary)
# 建立所有链接的list
url = "http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml"
url_2 = "http://www.nhc.gov.cn/xcs/yqtb/list_gzbd_2.shtml"
url_start =[]
url_start.append(url)
url_start.append(url_2)
for i in range(2,9):
url_3 = url_2.replace("_2.shtml",f"_{i}.shtml")
url_start.append(url_3)
url_start
urls = []
for i in url_start:
#循环获取全部连接
# url = "http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml"
browser.get(i)
time.sleep(3) #火狐需要人为等待,设置等待时间为5s
# print(browser.page_source) #查看源码
alls = browser.find_elements(By.CSS_SELECTOR, "li a")
for j in alls:
url_0 = j.get_attribute('href')
urls.append(url_0)
# urls
# browser.find_element(By.XPATH 非常好用,值得学习
# 正则表达式非常好用,值得学习
# 用时较长,我用了13分钟
allk =pd.DataFrame(columns=["time","confirm_all","dead_all","region"])
dalu ={}
hongkong ={}
taiwan= {}
for m in urls:
browser.get(m)
time.sleep(3)
news = browser.find_element(By.XPATH, '/html/body/div[3]/div[2]').text
'''大陆'''
dalu['time'] = re.search('截至(.*?)24时',news).group(1) #group(1)代表括号里的内容
#累计确诊(tx已有)
dalu['confirm_all'] = re.search('据31个省(自治区、直辖市)和新疆生产建设兵团.*?累计报告确诊病例(.*?)例',news).group(1)
#累计死亡(tx已有)
dalu['dead_all'] = re.search('据31个省(自治区、直辖市)和新疆生产建设兵团.*?累计死亡病例(.*?)例',news).group(1)
dalu['region'] = "大陆"
'''香港'''
hongkong['time'] = re.search('截至(.*?)24时',news).group(1) #group(1)代表括号里的内容
#累计确诊(tx已有)
hongkong['confirm_all'] = re.search('香港特别行政区(.*?)例', news).group(1)
#累计死亡(tx已有)
hongkong['dead_all'] = re.search('香港特别行政区.*?死亡(.*?)例)', news).group(1)
hongkong['region'] = "香港"
'''台湾'''
taiwan['time'] = re.search('截至(.*?)24时',news).group(1) #group(1)代表括号里的内容
#累计确诊(tx已有)
taiwan['confirm_all'] = re.search('台湾地区(.*?)例',news).group(1)
#累计死亡(tx已有)
taiwan['dead_all'] = re.search('台湾地区.*?死亡(.*?)例',news).group(1)
taiwan['region'] = "台湾"
grop1 = pd.DataFrame(dalu,index=[0])
grop2 = pd.DataFrame(hongkong,index=[0])
grop3 = pd.DataFrame(taiwan,index=[0])
all=pd.concat([grop1,grop2,grop3],axis=0,join='outer')
allk=pd.concat([all,allk],axis=0,join='outer')
print(m)
allk.to_csv("yiqing1.csv")
结果分析
死亡率变化情况
先计算每天的累计死亡率,用数据透视表查看三个地区的死亡率变化情况。
大陆和香港趋势一致,2022年5月以来死亡率一直呈下降趋势。其中大陆累计死亡率由5月的2.3%降低至11月的1.9%。
5至11月死亡率统计
因为5月起奥密克戎在中国爆发,所以单独计算5至11月的死亡率情况。可以看到,5至11月全国确诊人数7.8万人(不含无症状感染者),死亡人数15人,死亡率0.2‰。
重庆疫情数据
自2022年11月爆发新一轮疫情期,截至11月24日24时,重庆全市现有在院(含方舱医院)新冠患者和无症状感染者42732人,其中普通型194例占比4%、重型29例占比0.7‰、危重型15例占比0.3‰,未报道死亡病例。 数据来自 华龙网-新重庆客户端。
对比流感死亡率
根据发表在《预防医学》2022年9月月第 34 卷第9期的论文《2016—2019年浙江省流行性感冒超额死亡率分析》(程伟等)的数据,2016~2019年全部流感的超额死亡率为1.87‰。超额死亡率指的是直接或间接因为疾病死亡的预测死亡率。