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基础教程之序列详解
Aug 29 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
python绘制简单折线图代码示例
Dec 19 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
Python使用reportlab模块生成PDF格式的文档
Mar 11 Python
详解Python做一个名片管理系统
Mar 14 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 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 类商品秒杀计时实现代码
2010/05/05 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
DOM精简教程
2006/10/03 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
浅谈webpack 四个核心概念之Entry
2019/06/12 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
Python自动调用IE打开某个网站的方法
2015/06/03 Python
Python多进程同步简单实现代码
2016/04/27 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
django基础学习之send_mail功能
2019/08/07 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
高中生第一学年自我鉴定
2014/09/12 职场文书
乡镇领导班子四风整顿行动工作汇报
2014/10/25 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
Python机器学习之决策树和随机森林
2021/07/15 Javascript
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android