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

作者:Sqwlly 时间:2021-06-10 19:45:42 

前言

近几日迫于被辅导员三番五次的提醒每日一报打卡,就想着去写个脚本挂在服务器上定时执行。经过我不懈的努力,最终选择了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://www.jb51.net/article/183899.htm

来源:https://blog.csdn.net/Eternally831143/article/details/105174883

标签:python,selenium,crontab,打卡
0
投稿

猜你喜欢

  • Pytest mark使用实例及原理解析

    2021-02-27 14:30:11
  • python中的装饰器详解

    2022-08-14 04:32:05
  • PHP常用字符串函数小结(推荐)

    2023-06-14 00:18:50
  • Python学习之路安装pycharm的教程详解

    2021-11-15 23:07:51
  • JavaScript版俄罗斯方块Easy Tetris实现原理

    2009-07-16 10:25:00
  • python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法

    2023-05-17 04:33:11
  • python保存图片时如何和原图大小一致

    2022-07-13 03:34:36
  • Python warning警告出现的原因及忽略方法

    2021-10-16 10:59:02
  • oracle 存储过程和函数例子

    2023-06-26 08:19:30
  • python reduce 函数使用详解

    2022-11-01 22:20:57
  • sql数据库批量处理脚本

    2011-11-03 17:23:19
  • php连接不上mysql但mysql命令行操作正常的解决方法

    2023-11-18 20:02:43
  • asp 页面允许CACHE的方法

    2011-02-16 11:20:00
  • python 采用paramiko 远程执行命令及报错解决

    2021-01-23 19:17:16
  • ASP缓存类 【先锋缓存类】Ver2004

    2009-01-05 12:28:00
  • python实现手机通讯录搜索功能

    2023-11-04 08:04:08
  • asp如何在网站上提供音乐下载?

    2010-06-22 21:14:00
  • go实现服务优雅关闭的示例

    2023-08-06 09:01:08
  • line-height 属性的继承问题

    2008-07-26 12:27:00
  • WEB前端开发经验总结 Ⅰ

    2008-06-12 12:23:00
  • asp之家 网络编程 m.aspxhome.com