最近新型冠状病毒肆虐,在很近的地方都出现了病例,真的太可怕了……在家没事干还不如来写写程序,于是就有了这个,惠州疫情通报。
主要通过selenium截取惠州本地论坛西子湖畔上实时更新的疫情数据,发布的帖子一般都含有新增两个字,所以就爬取含有新增两个字的所有不带图新闻,用正则匹配到它的链接并进入。
进入帖子以后,如果是完整的含有病例列表格式的帖子,会直接利用Pandas进行处理,合成一个DataFrame,利用DataFrame的排序和to_html,再添加自定义css后上传到ftp服务器。
程序每900秒(15分钟)爬取一次看看数据是否有更新。
写的很烂,将就看吧。
from selenium import webdriver from selenium.webdriver.chrome.options import Options import re import pandas as pd from ftplib import FTP import time newsid="" def gethztb(): global newsid chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') driver=webdriver.Chrome(options=chrome_options) driver.get("https://www.xizi.com/") print("查询最新信息") items=driver.find_elements_by_class_name("flow-item") k=[] for i in items: try: if("新增" in i.get_attribute("innerHTML")): #.replace('href="',"") k.append(re.search('href="https://bbs.xizi.com([^"]*)',i.get_attribute("innerHTML")).group(1)) except Exception as e: print(e) if(len(k)>0 and k[0]!=newsid): newsid=k[0] print("找到最新疫情信息") print(k) driver.get("https://bbs.xizi.com"+k[0]) else: driver.quit() print("没有找到最新的疫情信息") return 0 t=driver.find_element_by_id("read_tpc").text driver.quit() try: #首先正则匹配 #print(t) id=[] sex=[] age=[] msg=[] bingli=re.findall(r'病例(.*?)(:|:)(男|女)(.*)',t) for i in bingli: #print(i[0],i[2],i[3].split(",")[1],i[3].split(",",2)[2]) id.append(int(i[0])) sex.append(i[2]) age.append(i[3].split(",")[1]) msg.append(i[3].split(",",2)[2]) binglidict={'病例':id,'性别':sex,'年龄':age,'详情':msg} binglidict_df=pd.DataFrame(binglidict) #网页格式 html_string=''' <html> <head><title>惠移物联:惠州疫情通报(仅供参考,请以官方通报为准)</title><meta http-equiv="Content-Type" content="text/html; charset=gbk" /></head> <link rel="stylesheet" type="text/css" href="ncov.css"/> <body> {table} </body> </html>. ''' with open('2019ncov.html','w') as f: f.write(html_string.format( table=binglidict_df.sort_values(by='病例').to_html(index=False))) print("已完成最新信息获取") except Exception as e: print("发生异常") print(e) if(True): ftp=FTP() ftp.connect("ftp地址") ftp.login("ftp账号","ftp密码") ftp.cwd("ftp目录") fp=open("2019ncov.html",'rb') bufsize=1024 ftp.storbinary('STOR index.html',fp,bufsize) ftp.close() print("已上传ftp") while True: gethztb() time.sleep(900)
Comments | NOTHING