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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM