从零开始在服务器上实现疫情自动化填报(采用Python+Selenium+Chrome的运行环境(静默模式、无图形))

由于疫情原因学校需要每日填报,所以思考能否自动化填报,网上教程大多是采用win下python是实现,故折腾了一番用服务器实现这一功能

一、安装jupyter notebook

1. 准备python环境

由于服务器涉及到python2与python3的设置,所以这里推荐安装Anaconda3
(1).下载Anaconda3,因为从官网下载的速度较慢,所以我们选择从清华的镜像站进行下载。(这里选择的是64位的版本,如果是32位系统,请自行选择32位的Anaconda3)

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh

(2).安装Anaconda3,全部默认选项即可。(一路按Enter和输入yes)

bash ./Anaconda3-5.3.1-Linux-x86_64.sh

更新环境变量

source ~/.bashrc

切换base环境

conda activate base

(启动完成之后,如果用户名的前面多了一个(base)则说明切换环境成功)

2. 更换pip和Anaconda下载源为清华源

(1)更换pip源
修改 ~/.pip/pip.conf (如果没有的话就创建一个)

mkdir ~/.pip
vim ~/.pip/pip.conf

在其中添加

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn

(2)换Anaconda源
生成配置文件

conda config --set show_channel_urls yes

修改配置文件

vim ~/.condarc

替换为如下内容:

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

3. 配置并后台运行 jupyter notebook

(1). 生成密文

python -c "import IPython;print(IPython.lib.passwd())"

设定并验证密码(不回显输入)(就是之后jupyter登录使用的密码)得到一个格式如下的字符串(大家的都不一样),先存下来备用。(如:)

sha1:37d1fc8f1a47:b71ffae7b324a724348ac232aa138bca0c2b4c66

(2).修改配置文件

jupyter notebook --generate-config --allow-root
vim ~/.jupyter/jupyter_notebook_config.py

我们可以在开头或末尾添加如下配置信息(或者去对应位置修改并取消注释),这里给出一些特别注意修改的项

## 设置允许用户使用管理员权限运行notebook
c.NotebookApp.allow_root = True

## 设置notebook服务监听的IP
c.NotebookApp.ip = '*'

## 设置notebook的工作目录 要用不带~的绝对路径
c.NotebookApp.notebook_dir = '/root/jupyterFile/root'

## 设置在启动notebook时,不自动启动浏览器
c.NotebookApp.open_browser = False

## 设置notebook的密码,用我们刚刚生成的密文去替换
c.NotebookApp.password = 'sha1:37d1fc8f1a47:b71ffae7b324a724348ac232aa138bca0c2b4c66'

## notebook服务监听的端口,选择一个空闲的端口即可
c.NotebookApp.port = 8080

注意:原配置文件中这几项有“#”注释,注意删除

(3)运行jupyter notebook查看调试输出

jupyter notebook

如果没有错误可以nohup运行:

nohup jupyter notebook > /root/log.file 2>&1 & (4)登录网页
在网页地址栏输入ip:端口号以登录(第一次登入会设置密码,token在运行jupyter notebook时会显示)

二、Selenium+Chrome的运行环境

1、 安装Chrome

在https://dl.google.com可找到Chrome的最新发行包(需要拉到页面底部):

如何实现python程序静默安装 python静默运行_python


(这里要注意Chrome版本和ChromeDriver的版本否则会报错)

然后执行安装:apt install /root/google-chrome-stable_current_amd64.deb

2、安装Webdriver
(1)在chromedriver官网下载chromedriver最新版本,历史版本可以在下载中心版本仓库中找到。
(2)将下载的文件解压,放在如下位置

unzip chromedriver_linux64.zip
mv chromedriver /usr/bin/

(3)给与执行权限

chmod +x /usr/bin/chromedriver

3.安装selenium

pip install selenium

至此环境部分已经全部完成

三、打开jupyter notebook运行疫情填报代码
代码如下

import time
# 本地Chrome浏览器的静默模式设置:
from selenium import  webdriver #从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options # 从options模块中调用Options类

def yqtb_nwpu():
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(options=chrome_options)
    driver.get('https://uis.nwpu.edu.cn/cas/login?service=https%3A%2F%2Fecampus.nwpu.edu.cn%2Fportal-web%2Fj_spring_cas_security_check')#转到翱翔门户登陆页面
    time.sleep(1)

    username=driver.find_element_by_id('username')
    username.clear()
    username.send_keys('这里填你的学号')#抓取用户名栏并输入学号
    password=driver.find_element_by_id('password')
    password.clear()
    password.send_keys('这里填你的密码')#抓取密码栏并输入密码
    driver.find_element_by_name('submit').click()#抓取登录按钮并点击
    time.sleep(1)

    butt=driver.find_element_by_name('疫情每日填报')
    driver.execute_script("arguments[0].click();", butt)#获取并点击疫情填报的按钮
    time.sleep(1)

    all_handles = driver.window_handles
    driver.switch_to.window(all_handles[1])
    driver.find_element_by_class_name('icon-shangbao1').click()
    time.sleep(1)

    driver.find_element_by_class_name('weui-btn_primary').click()#抓取提交按钮#提交
    sub2=driver.find_element_by_id('brcn')
    driver.execute_script("arguments[0].click();", sub2)
    driver.find_element_by_id('save_div').click()

可加入一下模块实现邮件提醒

# smtplib 用于邮件的发信动作
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头


# 发信方的信息:发信邮箱,QQ邮箱授权码)
#第一种方式:未定的发件人
#from_addr = input('请输入登录邮箱:')
#password = input('请输入邮箱授权码:') 
#第二种方式:已定的发件人
def send_mail():
    from_addr = '                   '
    password = '                     '

    # 收信方邮箱
    to_addrs = ['                      ']

    # 发信服务器
    smtp_server = 'smtp.qq.com'

    # 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
    text='已发送'
    msg = MIMEText(text,'plain','utf-8')

    # 邮件头信息
    msg['From'] = Header(from_addr)
    msg['To'] = Header(",".join(to_addrs)) 
    msg['Subject'] = Header('疫情填报')

    # 开启发信服务,这里使用的是加密传输
    server = smtplib.SMTP_SSL(smtp_server)
    server.connect(smtp_server,465)
    # 登录发信邮箱
    server.login(from_addr, password)
    # 发送邮件
    try:
        server.sendmail(from_addr, to_addrs, msg.as_string())
        print('填报成功')
    except:
        print('提交失败,请重试')
    # 关闭服务器
    server.quit()

然后就可以愉快的运行了。