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实现登录人人网并抓取新鲜事的方法
May 11 Python
Python自动登录126邮箱的方法
Jul 10 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
Python爬虫基础之爬虫的分类知识总结
May 13 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数字转汉字代码(算法)
2011/10/08 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
php获取系统变量方法小结
2015/05/29 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
Python中最大递归深度值的探讨
2019/03/05 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
第一节英语课开场白
2015/06/01 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
大学生社会服务心得体会
2016/01/22 职场文书