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亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...
随机推荐
- Zabbix自定义模板监控多个url接口
一.脚本配置 1.监控脚本 /etc/zabbix/zabbix_agent2.d/scripts/web_site_code_status.sh #!/bin/bash url_discovery( ...
- js实现刮刮卡抽奖
刮刮卡抽奖是前端活动页常见的功能: 链接:图像擦除插件(下载及教程讲解) 推荐理由:无缝刮痕,兼容性好,上手简单 插件有些要修改的地方,打开图像擦除插件后可以看下方网友讨论,或者直接下载本博 ...
- 2020传智博黑马python课
网上花钱买来的资源,免费分享给冷冷的兄弟们! 已经把相关网站广告后缀名全部替换修改,现在文件已经全部没有广告了, 不过就是课件的压缩包需要密码,已经在该文件夹说明,大家放心使用, 文件清爽,文件名 ...
- Vue-组件化,父组件传子组件常见传值方式
前言 我们都知道vue核心之一:组件化,vue中万物皆组件,组件化我认为应该来至于模块化的设计思想,比如在模块化开发中,一个模块就是一个实现特定功能的独立的文件,有了模块我们就更方便去阅读代码,更方便 ...
- Pytest 学习(二十五)- 解决pytest参数化测试标题都一样问题
前言 使用参数化测试化后,allure的报告如下显示: 源代码如下: # -*- coding: utf-8 -*- # @Time : 2020/12/13 17:27 # @Author : lo ...
- DHCP spooping非法获取地址设置原理
一.DHCP概述 DHCP(动态主机配置协议)是一个局域网的网络协议.指的是由服务器控制一段IP地址范围,客户机登录服务器时就 可以自动获得服务器分配的IP地址和子网掩码.默认情况下,DHCP作为Wi ...
- burpsuite进阶使用
.Burpsuite:爆破 个人建议选择pro破解版的,免费版的太鸡肋,爆破不能设置线程,速度超乎你想像 浏览器和burpsuite设置代理后,开启抓包,截获数据包后,右键选择发送到repeater修 ...
- Viterbi算法
clc;clear all;close all; Start_Pi = [-1,-1];State_k = ['H','L'];% 转移矩阵Transition_matrix = [-1,-1.322 ...
- DotNet .Net Framework与Net Core与Net Standard 以及.NET5
Net Framework 是什么 1.Net Framework 是Net的一种实现,在此类库上我们可以使用C#,VB,F#进行程序编写,主要用于构建Windows 下的应用程序 2.有两部分组成部 ...
- Asp.Net WebApi使用Websocket
直接上代码 /// <summary> /// WebSocket Handler /// </summary> public class QWebSocketHandler ...