selenium爬虫 | 爬取疫情实时动态(二)
'''
@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爬虫 | 爬取疫情实时动态(二)的更多相关文章
- selenium爬虫 | 爬取疫情实时动态
import csvimport selenium.webdriverfrom selenium.webdriver.chrome.options import Optionsclass spider ...
- 使用selenium再次爬取疫情数据(链接数据库)
爬取网页地址: 丁香医生 数据库连接代码: def db_connect(): try: db=pymysql.connect('localhost','root','zzm666','payiqin ...
- [python爬虫] Selenium定向爬取PubMed生物医学摘要信息
本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容. PubMed是一个免费的搜寻引擎,提供生物医学方 ...
- Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页
Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...
- python3爬虫爬取网页思路及常见问题(原创)
学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...
- selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)
一.问题使用selenium自动化测试爬取知乎的时候出现了:错误代码10001:请求异常请升级客户端后重新尝试,这个错误的产生是由于知乎可以检测selenium自动化测试的脚本,因此可以阻止selen ...
- python3 爬虫---爬取豆瓣电影TOP250
第一次爬取的网站就是豆瓣电影 Top 250,网址是:https://movie.douban.com/top250?start=0&filter= 分析网址'?'符号后的参数,第一个参数's ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
- Python爬虫|爬取喜马拉雅音频
"GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...
随机推荐
- Java并发编程的艺术(六)——中断、安全停止线程
什么是中断 Java的一种机制,用于一个线程去暂停另一个线程的运行.就是一个正在运行的线程被其他线程给打断,停止运行挂起了. 我觉得,在Java中,这种中断机制只是一种方便程序员编写进程间的通信罢了. ...
- shell--数据库备份脚本
#!/bin/bash #数据库的完全备份 #把日期显示为170605(这个是当前的时间)的格式 date=$(date +%y%m%d) #计算下这个备份的数据库文件的大小 size=$(du -s ...
- 把java编译成exe和安装包
由于某些项目甲方迟迟不结算尾款,这就很烦,只能想一些办法 我们知道java,python之类的代码是没有隐私可言的,那么怎么办,总要发给甲方验收,这就要做一些操作来确保自己的利益. 通过在源代码里加上 ...
- Pytest 学习(二十五)- 解决pytest参数化测试标题都一样问题
前言 使用参数化测试化后,allure的报告如下显示: 源代码如下: # -*- coding: utf-8 -*- # @Time : 2020/12/13 17:27 # @Author : lo ...
- ubuntu ImportError: No module named setuptools 一句命令解决方案
https://blog.csdn.net/Super_jm_/article/details/81947563 使用pip安装文件时候提示 ImportError: No module named ...
- SMART
SMART原则: S(Specific):目标必须是具体的,要对标特定的工作指标,不能笼统: M(Measurable):目标必须是可衡量的,衡量的指标是数量化或者行为化的,验证这些指标的数据或者信息 ...
- 百度实习生,以修仙者的角度聊聊怎么学MySQL,不来看看你的修为如何吗?
目录 因为我个人比较喜欢看修仙类的小说,所以本文的主体部分借用修仙者的修为等级,将学习旅程划分成:练气.筑基.结丹.元婴.化神.飞升六个段位,你可以看下你大概在哪个段位上哦! 本文目录: 我为什么要写 ...
- DRF终极封装ViewSet和Router附教程PDF源码
在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作.本文是教程的最后一篇,介绍 ...
- 无法启动IIS Express Web服务器
解决 打开项目文文件夹以.csproj结尾的文件),找到WebProjectProperties节点然后,将图中框选的三项节点内容全部清空 删除.vs 重新启动即可
- 谈谈hive中join下on和where
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 很多人如果先接触mysql的执行顺序(from ->on ->join -&g ...