'''
@author:Billie
更新说明:
1-28 17:00 项目开始着手,spider方法抓取到第一条疫情数据,save_data_csv方法将疫情数据保存至csv文件
1-29 13:12 目标网页文档树改变,爬取策略修改,建立新方法:spider2
1-30 15:00 新建变量national_confirm,存储全国新增确诊数
1-31 15:00 摸鱼,缝缝补补又一天
2-01 15:00 目标网页文档树又改变了,爬取策略修改,建立新方法:spider3,全国数据改用xpath方法查找,全国数据新增“较昨日+”内容显示
2-02 15:00 建立新方法:save_data_main,存储所有日期的全国动态数据到main.csv,复习numpy,pandas
'''
import csv
import pandas as pd
import numpy as np
import selenium.webdriver
from selenium.webdriver.chrome.options import Options
import threading
import os
import matplotlib.pyplot as plt
class Epidemic():
def spider(self,url):
global timeNum, provinceDic
# 无窗口弹出操作
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver=selenium.webdriver.Chrome(options=options)
driver.get(url)
timeNum=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[1]/div/p[1]').text[2:]#实时
icbar_confirm=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[1]/div[2]').text#全国确诊数
icbar_confirm_add=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[1]/div[1]').text#全国确诊数add
icbar_suspect=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[2]/div[2]').text#疑似病例数
icbar_suspect_add=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[2]/div[1]').text#疑似病例数add
icbar_cure=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[3]/div[2]').text#治愈人数
icbar_cure_add=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[3]/div[1]').text#治愈人数add
icbar_dead=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[4]/div[2]').text#死亡人数
icbar_dead_add=driver.find_element_by_xpath('//*[@id="charts"]/div[2]/div[2]/div[4]/div[1]').text#死亡人数add
print("\n{}\n全国确诊:{}\n疑似病例:{}\n治愈人数:{}\n死亡人数:{}\n".format(timeNum, icbar_confirm+" "+icbar_confirm_add,icbar_suspect+" "+icbar_suspect_add, icbar_cure+" "+icbar_cure_add, icbar_dead+" "+icbar_dead_add))
hubei=driver.find_elements_by_css_selector('div[class="placeItemWrap current"]')#湖北省的数据集
wuhan=driver.find_elements_by_css_selector("div[city='武汉']")#武汉市的数据集
elprovince = driver.find_elements_by_css_selector('div[class="placeItemWrap"]')#其他省的数据集
abroad = driver.find_elements_by_css_selector('div[class="clearfix placeItem placeArea no-sharp abroad"]')#海外国家的数据集
tplt = "{1:{0}<10}\t{2:{0}<15}\t{3:{0}<15}\t{4:{0}<15}\t{5:{0}<15}"
print(tplt.format(chr(12288),"地区","新增确诊","确诊人数","治愈人数","死亡人数",))
# 建立两个变量
national_confirm = 0#全国新增确诊
provinceDic = dict()#键为省名,值为省的具体数据
places = hubei + wuhan + elprovince + abroad#所有的地区的数据列表合集
for place in places:#查找目标,name\add\confirm\heal\dead
name=place.find_element_by_css_selector("h2").text#湖北/武汉/国内/海外地区
try:add=place.find_element_by_css_selector("div[class='add ac_add ']").text#国内新增确诊
except:
if name=="武汉":add = place.find_element_by_css_selector("div[class='ac_add ']").text#武汉地区新增确诊
else:add=""#海外地区无数据
try:confirm=place.find_element_by_css_selector("div[class='confirm']").text#国内累计确诊
except:
if name=="武汉":confirm=place.find_elements_by_css_selector("div")[1].text#武汉累计
else:confirm = place.find_elements_by_css_selector("div")[0].text#海外累计确诊
try:heal=place.find_element_by_css_selector("div[class='heal']").text#国内治愈人数
except:
if name=="武汉":heal=place.find_elements_by_css_selector("div")[2].text#武汉治愈人数
else:heal = place.find_elements_by_css_selector("div")[1].text#海外治愈
try:dead=place.find_element_by_css_selector("div[class='dead']").text#国内死亡
except:
if name=="武汉":dead = place.find_elements_by_css_selector("div")[3].text #武汉死亡人数
else:dead = place.find_elements_by_css_selector("div")[2].text#海外死亡人数
print(tplt.format(chr(12288),name,add,confirm,heal,dead,))
provinceDic[name]=[name,confirm,heal,dead,add]
try:#计算全国新增确诊数
if name == "武汉":pass
else:national_confirm+=int(add)
except:#数据项为"-",则跳过
pass
provinceDic["全国"] = ["全国", icbar_confirm, icbar_cure, icbar_dead, national_confirm, icbar_suspect]
def save_data_csv(self,filepath,filename,dataDic,timeNum):
# filename="_".join(time.split(":"))
dataList=list(dataDic.values())
with open(filepath+"//"+filename+".csv","w",newline="") as f:
writer=csv.writer(f)
writer.writerow(["地区","确诊人数","治愈人数","死亡人数","新增确诊","疑似病例"])
writer.writerow(dataDic["全国"])#第一行写入全国的数据
for i in dataList[:-2]:
writer.writerow(i)
writer.writerow([timeNum])#最后一行附上截至时间
f.close()
def save_data_main(self,filename):#存储所有日期的全国动态数据
allfile=os.listdir("dailycsv")#所有的目标文件
columns=["确诊人数", "治愈人数", "死亡人数", "新增确诊", "疑似病例"]#df参数1:main.csv的行索引
index = []#df参数2:main.csv的列索引
datalist = []#df参数3:写入df的数据
for file in allfile:#file: 2020-xx-xx xx xx xx.csv
index.append(file[:-4])#索引为去掉'.csv'的文件名
with open("dailycsv//"+file,"r") as f:#打开目标文件
data=list(csv.reader(f))#读取目标文件数据,返回list
datalist.append(data[1][1:])#目标数据是第一行的全国数据,且从第二列开始
f.close()
df=pd.DataFrame(datalist,index=index,columns=columns)#创建dataframe对象
df.to_csv(filename,encoding="gbk")#将dataframe对象保存至csv文件
def main(self):
base_url = "https://news.qq.com/zt2020/page/feiyan.htm"
self.spider(url=base_url)#获取疫情实时动态信息
self.save_data_csv(filepath="allcsv",\
filename=timeNum[3:22].replace(":"," "),\
dataDic=provinceDic,\
timeNum=timeNum[:22])#存入allcsv文件
self.save_data_csv(filepath="dailycsv",\
filename=timeNum[3:22].replace(":"," ")[:10],\
dataDic=provinceDic,\
timeNum=timeNum[:22])#存入dailycsv文件
self.save_data_main(filename="main.csv")#存入main.csv文件
#设定运行间隔时间
global timer
timer=threading.Timer(1000,self.main)
timer.start()
if __name__ == '__main__':
billie=Epidemic()
billie.main()

selenium爬虫 | 爬取疫情实时动态(二)的更多相关文章

  1. selenium爬虫 | 爬取疫情实时动态

    import csvimport selenium.webdriverfrom selenium.webdriver.chrome.options import Optionsclass spider ...

  2. 使用selenium再次爬取疫情数据(链接数据库)

    爬取网页地址: 丁香医生 数据库连接代码: def db_connect(): try: db=pymysql.connect('localhost','root','zzm666','payiqin ...

  3. [python爬虫] Selenium定向爬取PubMed生物医学摘要信息

    本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方 ...

  4. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

  5. python3爬虫爬取网页思路及常见问题(原创)

    学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...

  6. selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)

    一.问题使用selenium自动化测试爬取知乎的时候出现了:错误代码10001:请求异常请升级客户端后重新尝试,这个错误的产生是由于知乎可以检测selenium自动化测试的脚本,因此可以阻止selen ...

  7. python3 爬虫---爬取豆瓣电影TOP250

    第一次爬取的网站就是豆瓣电影 Top 250,网址是:https://movie.douban.com/top250?start=0&filter= 分析网址'?'符号后的参数,第一个参数's ...

  8. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  9. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

随机推荐

  1. 深入理解Java虚拟机(七)——类文件结构

    Java的无关性 由于计算机领域中有很多操作系统和硬件平台同时在竞争,所以,很多编程语言的程序设计会与其运行的平台和操作系统产生耦合,这样就大大增加了程序员的工作,为了适应不同的平台,需要修改很多代码 ...

  2. uniapp发布到微信小程序整改摘要

    uniapp作为跨端的利器,可同时发布到安卓.ios.微信小程序.支付宝小程序.百度小程序.头条小程序.QQ小程序等8个平台. 如果是轻量级的应用,不涉及太多功能的话,或许可以直接打包移植,但涉及前后 ...

  3. sql注入之双查询注入

    双查询注入前需要了解什么是子查询 子查询可以理解在一个select语句中再插入一个select 里面的select语句就是子查询 例子:select concat((select database() ...

  4. mycat配置MySQL主从读写分离

    1.安装java 1.8 mycat 1.6要求的Java需要Java 1.8或1.8以上,安装Java参考以下链接: https://blog.csdn.net/weixin_43893397/ar ...

  5. Java 8 新特性——实践篇

    Java 8 新特性--实践篇 参考 Java8新特性 重要更新:Lambda 表达式和Stream API Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的 ...

  6. .net core WebAPI性能监控-MiniProfiler与Swagger集成

    ------------恢复内容开始------------ 安装Nuget Install-Package MiniProfiler.AspNetCore.Mvc Install-Package M ...

  7. Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

  8. Docker(三):Docker安装MySQL

    查找MySQL镜像 镜像仓库 https://hub.docker.com/ 下拉镜像 docker pull mysql:5.7 查看镜像 docker images 创建MySQL容器 命令式启动 ...

  9. Github标星26k+!一个神奇的软件!1分钟即可打造了一个科幻风格的终端

    Github掘金计划项目分类汇总(原创不易,若有帮助,欢迎分享/点赞): 编程基础 :精选编程基础如学习路线.编程语言相关的开源项目. 计算机基础:精选计算机基础(操作系统.计算机网络.算法.数据结构 ...

  10. 给因特尔S2600CO服务器主板安装【SAS控制器】驱动

    给因特尔S2600CO服务器主板安装[SAS控制器]驱动 1:首先打开[设备管理器]找到未识别驱动的[SAS控制器]双击进入 2:在[详细信息]选项卡,选择[兼容Id]属性可以看到PCI\VEN_80 ...