基于Selenium的疫情通报


最近新型冠状病毒肆虐,在很近的地方都出现了病例,真的太可怕了……在家没事干还不如来写写程序,于是就有了这个,惠州疫情通报。

主要通过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)


想要成为自己的未来