• 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(" {} 全国确诊:{} 疑似病例:{} 治愈人数:{} 死亡人数:{} ".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} {2:{0}<15} {3:{0}<15} {4:{0}<15} {5:{0}<15}"
    print(tplt.format(chr(12288),"地区","新增确诊","确诊人数","治愈人数","死亡人数",))
    # 建立两个变量
    national_confirm = 0#全国新增确诊
    provinceDic = dict()#键为省名,值为省的具体数据
    places = hubei + wuhan + elprovince + abroad#所有的地区的数据列表合集
    for place in places:#查找目标,nameaddconfirmhealdead
    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()

  • 相关阅读:
    离线下载使用Google商店插件crx
    springboot thymeleaf 引入js
    如何保证系统重启,tomcat自动重启
    如何实现财务自由
    理财之道
    九大职场定律
    算法系列二:如何学习算法
    FastDFS结合Flask使用
    系统权限的实现
    正则表达式
  • 原文地址:https://www.cnblogs.com/billie52707/p/12272097.html
Copyright © 2020-2023  润新知