1. 程式人生 > 程式設計 >Python + selenium + crontab實現每日定時自動打卡功能

Python + selenium + crontab實現每日定時自動打卡功能

前言

近幾日迫於被輔導員三番五次的提醒每日一報打卡,就想著去寫個指令碼掛在伺服器上定時執行。經過我不懈的努力,最終選擇了seleniumseleniumselenium,因為簡單(

安裝selenium庫

$ sudo pip install selenium

安裝chromdriver

因為我有代理所以直接在官網下載的,那這裡你可以選擇用淘寶映象源。

在這裡插入圖片描述

這裡為了方便,我直接放命令了。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')
 ]

 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

到此這篇關於Python + selenium + crontab實現每日定時自動打卡的文章就介紹到這了,更多相關python 定時自動打卡內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!