'''
@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. Git:git常用命令

    1.版本控制工具     一个可以管理和追踪软件代码的工具.     分类:       集中式版本控制工具:SVN       分布式版本控制工具:Git 2.Git 的概念:     工作区:就是 ...

  2. 轮廓检测论文解读 | Richer Convolutional Features for Edge Detection | CVPR | 2017

    有什么问题可以加作者微信讨论,cyx645016617 上千人的粉丝群已经成立,氛围超好.为大家提供一个遇到问题有可能得到答案的平台. 0 概述 论文名称:"Richer Convoluti ...

  3. Elasticsearch.Net

    今天使用Elasticsearch作开发,很简单的查询,就出现Elasticsearch.Net.UnexpectedElasticsearchClientException异常,看样子像是序列化的异 ...

  4. synchronized实现原理及ReentrantLock源码

    synchronized synchronized的作用范围 public class SynchronizedTest { // 实例方法,方法访问标志ACC_SYNCHRONIZED,锁对象是对象 ...

  5. create-react-app 基于TS的项目

    写在前面 最近在用React,发现百度了很多都没有找到基于TS的React项目搭建,很多是老的方法已经属于不成功的了,今天我把最新的搭建基于ts的React的项目分享出来 create-react-a ...

  6. vue第十四单元(认识单页面应用,理解vue-router的基本用法)

    第十四单元(认识单页面应用,理解vue-router的基本用法) #课程目标 1.了解单页应用与多页应用以及各自的优缺点 2.掌握路由如何实现单页应用 3.精通路由的基本语法 #知识点 #一.单页应用 ...

  7. Numpy的学习1-创建数据基础

    1 import numpy as np 2 3 array = np.array([[1,2,3],[4,5,6]]) 4 5 print(array) 6 print('number of dim ...

  8. (四)、vim的缓冲区、标签、窗口操作

    1.缓冲区的基本操作 a.文件与缓冲区的区别 vim file1   打开一个文件时,其实是从磁盘中读取文件到内存中,文件的内容会被加载到缓冲区中, 这个缓冲区在一个窗口上显示,所以他是一个已激活的缓 ...

  9. Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)

    PDF文件格式 如今,可移植文档格式(PDF)属于最常用的数据格式.在1990年,PDF文档的结构由Adobe定义.PDF格式的思想是,对于通信过程中涉及的双方(创建者,作者或发送者以及接收者)而言, ...

  10. Code-Review-Maven编译(第三方jar包引用)

    Code-Review-SpringBoot-Maven编译(第三方jar包引用) 在使用maven编译项目时,有时候咱们可能会使用一些第三方的jar包依赖库,比如第三方支付类的接入,大多出于安全考虑 ...