Python + selenium + crontab实现每日定时自动打卡功能


Posted in Python onMarch 31, 2020

前言

近几日迫于被辅导员三番五次的提醒每日一报打卡,就想着去写个脚本挂在服务器上定时执行。经过我不懈的努力,最终选择了seleniumseleniumselenium,因为简单(

安装selenium库

$ sudo pip install selenium

安装chromdriver

因为我有代理所以直接在官网下载的,那这里你可以选择用淘宝镜像源。

Python + selenium + crontab实现每日定时自动打卡功能

这里为了方便,我直接放命令了。Chromedriver版本我这里选择的是80.0.3987.16(注意要和一会儿下载的Chrome版本一致)。

下载

$ wget https://npm.taobao.org/mirrors/chromedriver/80.0.3987.16/chromedriver_linux64.zip

解压

$ unzip chromedriver_linux64.zip -d .

放到相应目录并授予可执行权限

$ sudo cp chromedriver /usr/bin && sudo chmod +x /usr/bin/chromedriver

安装Chrome安装依赖

$ sudo apt-get install libxss1 libappindicator1 libindicator7

安装Chrome

$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb$ sudo dpkg -i google-chrome*.deb$ sudo apt-get install -f

查看版本

$ google-chrome --version

测试调试

$ google-chrome --headless --remote-debugging-port=9222 https://chromium.org --disable-gpu

编写脚本创建脚本并授予权限

$ touch dailyReport.py && touch dailyReport.log && sudo chmod +x dailyReport.py

内容

# encoding=utf8
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time


class DailyReport(object):
 def __init__(self):
 self.chrome_options = webdriver.ChromeOptions()
 self.chrome_options.add_argument('--headless')
 self.chrome_options.add_argument('--disable-gpu')
 self.chrome_options.add_argument('--no-sandbox') # 这个配置很重要
 self.client = None
 # self.client = webdriver.Chrome(chrome_options=self.chrome_options)
 self.index_url = 'https://xxxxx/xxxx/login'
 self.report_url = 'https://xxxx/xxxx/report'
 self.data = [
  ('用户名', '密码'),
  ('xxxx', 'xxxx'),
  ('xxxx', 'xxxx'),
  ('xxxx', 'xxxx'),
  ('xxxx', 'xxxx')
 ]

 def login(self, _username, _password):
 try:
  self.client = webdriver.Chrome(chrome_options=self.chrome_options)
  print(self.get_current_time() + ' ' + _username + u'开始进行打卡'.encode('utf-8'))
  self.client.get(self.index_url)
  username = self.client.find_element_by_name("username")
  password = self.client.find_element_by_name('password')
  username.send_keys(_username)
  password.send_keys(_password)
  login_button = self.client.find_element_by_xpath('//*[@id="form1"]/div[4]/button')
  login_button.click()
 except NoSuchElementException:
  print(self.get_current_time(), u'登录异常!'.encode('utf-8'))
 else:
  # time.sleep(2)
  print(self.get_current_time() + ' ' + u'登录成功!'.encode('utf-8'))

 def post_data(self):
 try:
  self.client.get(self.report_url)
  submit_button = self.client.find_element_by_xpath('//*[@id="p1_ctl00_btnSubmit"]/span/span')
  submit_button.click()
  ensure_button = self.client.find_element_by_xpath('//*[@id="fineui_26"]/span/span')
  ensure_button.click()
  # print (client.page_source.encode('utf-8'))
 except NoSuchElementException:
  print(self.get_current_time(), u' 提交表单异常! 打卡失败!'.encode('utf-8'))
 else:
  # time.sleep(2)
  print(self.get_current_time() + ' ' + u'打卡成功!\n'.encode('utf-8'))
 finally:
  time.sleep(5)
  self.client.quit()
  print(u'浏览器退出...\n--------------\n'.encode('utf-8'))

 def run(self):
 for msg in self.data:
  self.login(msg[0], msg[1])
  self.post_data()
 print('Python script completed at ' + self.get_current_time() + '\n--------------\n')

 @staticmethod
 def get_current_time():
 return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

if __name__ == '__main__':
 obj = DailyReport()
 obj.run()

脚本内容需要根据不同网站做对应的修改。

脚本定时执行

这里我们利用LinuxLinuxLinux的内置命令crontabcrontabcrontab,关于crontabcrontabcrontab的用法请自行百度ororor谷歌。

$ crontab -e

如果是首次使用,应该会让你选择编辑器,我选择的vimvimvim,然后在最后一行加入一行

0 0 * * * python ~/dailyReport.py >> ~/dailyReport.log

这样就可以做到每天00:0000:0000:00自动执行脚本了。

Chrome在服务器端运行参考博文:https://3water.com/article/183899.htm

到此这篇关于Python + selenium + crontab实现每日定时自动打卡的文章就介绍到这了,更多相关python 定时自动打卡内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python下MySQLdb用法实例分析
Jun 08 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
Python实现采用进度条实时显示处理进度的方法
Dec 19 Python
如何用python整理附件
May 13 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
python3连接MySQL数据库实例详解
May 24 Python
python+django+rest框架配置创建方法
Aug 31 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
深入理解Python 多线程
Jun 16 Python
django 装饰器 检测登录状态操作
Jul 02 Python
python安装sklearn模块的方法详解
Nov 28 Python
python单例模式的应用场景实例讲解
Feb 24 Python
python实现udp聊天窗口
Mar 31 #Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 #Python
Python sorted排序方法如何实现
Mar 31 #Python
解决Django中checkbox复选框的传值问题
Mar 31 #Python
Python文本文件的合并操作方法代码实例
Mar 31 #Python
Python调用接口合并Excel表代码实例
Mar 31 #Python
Python如何批量获取文件夹的大小并保存
Mar 31 #Python
You might like
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
js活用事件触发对象动作
2008/08/10 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
python文件编写好后如何实践
2020/07/07 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
网络研修随笔感言
2014/02/17 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
2014年销售工作总结
2014/12/01 职场文书
小学运动会通讯稿
2015/07/18 职场文书
小学班级口号大全
2015/12/25 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
创业计划书之便利店
2019/09/05 职场文书