Loading... ## 从零开始在服务器上实现疫情自动化填报(采用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的最新发行包(需要拉到页面底部) Ps:这里要注意Chrome版本和ChromeDriver的版本否则会报错 然后执行安装:apt install /root/google-chrome-stable_current_amd64.deb 2、安装Webdriver (1)在[chromedriver](https://chromedriver.chromium.org/)官网下载chromedriver最新版本,历史版本可以在[下载中心](https://chromedriver.chromium.org/downloads)或[版本仓库](https://chromedriver.storage.googleapis.com/index.html)中找到。 (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() ``` 然后就可以愉快的运行了。 最后修改:2024 年 08 月 29 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏
1 条评论
看的我热血沸腾啊https://www.237fa.com/