从零开始在服务器上实现疫情自动化填报(采用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的最新发行包(需要拉到页面底部):
(这里要注意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()
然后就可以愉快的运行了。