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 获取et和excel的版本号
Apr 09 Python
举例讲解Python面相对象编程中对象的属性与类的方法
Jan 19 Python
python 处理string到hex脚本的方法
Oct 26 Python
python三大神器之fabric使用教程
Jun 10 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
Python如何对齐字符串
Jul 30 Python
python 字符串格式化的示例
Sep 21 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利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
php-msf源码详解
2017/12/25 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
解析JavaScript中instanceof对于不同的构造器或许都返回true
2013/12/03 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
图解javascript作用域链
2019/05/27 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
python requests 使用快速入门
2017/08/31 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
对python中UDP,socket的使用详解
2019/08/22 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
继承公证书样本
2014/04/04 职场文书
运动会口号16字
2014/06/07 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
雷锋之歌观后感
2015/06/10 职场文书
小学见习报告
2015/06/23 职场文书
陪护人员误工证明
2015/06/24 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
vue ref如何获取子组件属性值
2022/03/31 Vue.js
Spring Boot实现文件上传下载
2022/08/14 Java/Android