中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 怎么在Python中使用webdriver實現一個圖書館座位自動預約功能

怎么在Python中使用webdriver實現一個圖書館座位自動預約功能

發布時間:2021-03-04 14:14:47 來源:億速云 閱讀:256 作者:Leah 欄目:開發技術

怎么在Python中使用webdriver實現一個圖書館座位自動預約功能?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

Python主要用來做什么

Python主要應用于:1、Web開發;2、數據科學研究;3、網絡爬蟲;4、嵌入式應用開發;5、游戲開發;6、桌面應用開發。

Python chrome driver操作

怎么在Python中使用webdriver實現一個圖書館座位自動預約功能

有幾個注意的點:

  • 每天早上系統開放的時間有幾分鐘的差別,需要留時間嘗試。

  • 剛開放的時候,系統會很卡,所以很可能會出現獲取元素失敗之類的情況。

這就要求我們的程序得有足夠的魯棒性(哈哈蛤) 容錯能力,不會一下崩了就沒用了。
所以我選擇用try...except...的方法去進行,寫了好多個try, 希望能找到不寫這么多Try的更好的方法。

導入庫并聲明瀏覽器:

from selenium import webdriver
option = webdriver.ChromeOptions()
url='網址'
local_dir = 'C:\\Users\\Administrator\\Desktop\\librarytest\\' #webdiriver 位置
browser = webdriver.Chrome(local_dir+"chromedriver.exe",options=option)

完整流程:

使用selenium操作非常簡單,就是find_element_by_id()find_element_by_xpath(),主要是看F12去找他們的xpath或者id。

def wholeProcess(browser):
 browser.get(url)
 try:
 btn=browser.find_element_by_xpath("/html/body/div[4]/div[2]/div[2]/dl/input") #找到登錄的按鈕,如果沒找到證明還沒到開放時間/系統在崩潰
 except:
 return 1 #1說明預約還沒到時候
 '''執行到這里說明打開啦'''
 try:
 btn.click()
 username=browser.find_element_by_id("un")
 password=browser.find_element_by_id("pd")#找到賬號密碼
 username.send_keys(studentNumber)
 password.send_keys(loginPassword)
 btn=browser.find_element_by_xpath('//*[@id="index_login_btn"]/input')#找到登錄按鍵
 btn.click()
 js=generateJsCode(startTime,endTime)#使用js代碼來預約
 res=browser.execute_script(js)
 return 0
 except:
 return 2 #2說明打開了網頁,但是遇到了其它問題

用js來預約

找到座位并選擇,如果用鼠標操作的話是很繁瑣的,包括先找到座位圖標點擊下拉選擇開始時間和結束時間,再點擊預約,這個過程麻煩不說,主要是容易出錯。
而其實一個座位預定的本質其實是提交一個表單。瀏覽器的前端做了那么多人性化的操作,如可視化座位表、下拉框、溫馨提示等,就是為了人使用時好看而又方便,而我們作為計算機就可以饒過他,直接提交表單。這里用的是selenium的execute_script()函數,可以用來執行網頁上的js代碼。

生成js代碼

用F12去觀察發現,圖書管的表單提交需要下面幾步:

$("#date").val("2020-12-10"); 
$("#reserveForm#seat").val("13022"); //座位號
$("#start").val("540"); //用分鐘表示的時間 : 540=9*60 即九點
$("#end").val("1260");
$("#reserveForm").submit();

因此這個函數用來生成js代碼:

def generateJsCode(startTime_ori,endTime_ori):
 seatnumber_str = seatId
 startTime_str = str(startTime_ori * 60)
 endTime_str = str(endTime_ori * 60)
 tomorrowTime = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime('%Y-%m-%d') # 明天
 js = '$("#date").val("' + tomorrowTime + '");$("#reserveForm #seat").val("' + seatnumber_str + '");$("#start").val("' + startTime_str + '");$("#end").val("' + endTime_str + '");$("#reserveForm").submit();'
 return js

主函數——程序出錯時嘗試:

返回的狀態中,如果網頁沒打開,讓他休息10s再嘗試,如果是其它原因,那么休息0.5秒就繼續嘗試:

if __name__=='__main__':
 browser = webdriver.Chrome(local_dir+"chromedriver.exe",options=option)#聲明瀏覽器
 while True:
 state=wholeProcess(browser)
 if state==0: #沒出錯
  break:
 elif state==1: 
  logger.info("打開網頁失敗")
  time.sleep(10)
 elif state==2: 
  logger.info("其它錯誤")
  time.sleep(0.5)

檢測是否成功:

除了上面提到的網頁崩潰導致WebDriver報錯,還有幾種可能導致失敗:

  • 座位被人搶了

  • 已經有過預約了

  • 有人約了但不是全部時間段。

這幾種錯誤都不會報錯,會在執行代碼后以標簽的形式告訴我們,可以用關鍵字定位這些標簽,如果失敗可以選擇預約PlanB:
比如:

try:
 a=browser.find_element_by_xpath("//*[contains(text(),'盡快')]") #有人約了(非全部時間)
 error_reason=a.text
 isNoSeat=True

logging: 生成每天的日志文件

寫好小程序以后,幾個兄弟聽說了也想嘗試,每天預約。
不想每天早上七點起來看,為了防止為止錯誤發生后還不知道是哪步出錯,采取的辦法是寫日志文件(事后追責),這里使用的是logging這個包。
logger的初始化代碼來源 : python的logging模塊

import logging
# 創建一個logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 創建一個handler,用于寫入日志文件
fh = logging.FileHandler(local_dir+'logfile\\'+logname+'.log')
fh.setLevel(logging.DEBUG)
# 再創建一個handler,用于輸出到控制臺
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定義handler的輸出格式
formatter = logging.Formatter('[%(asctime)s][%(thread)d][%(filename)s][line: %(lineno)d][%(levelname)s] ## %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 給logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 記錄一條日志

記錄時只要使用 logger.info("xxxxx")就可以,非常方便,寫在了上面。

Windows定時任務

  •  此電腦上右鍵管理

  • 右側有創建任務(下圖)

怎么在Python中使用webdriver實現一個圖書館座位自動預約功能

  • 觸發器選項卡中新建,并設定時間

  • 操作選項卡中新建,并選擇程序路徑(下圖)

怎么在Python中使用webdriver實現一個圖書館座位自動預約功能

這樣就程序就會每天早上執行,只要有一臺不關機的電腦。

看完上述內容,你們掌握怎么在Python中使用webdriver實現一個圖書館座位自動預約功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上犹县| 莲花县| 阿瓦提县| 吐鲁番市| 尼勒克县| 台州市| 舟山市| 鹤岗市| 孝义市| 亚东县| 神农架林区| 郸城县| 天镇县| 英吉沙县| 安徽省| 百色市| 突泉县| 梁平县| 克什克腾旗| 台南市| 微山县| 玉溪市| 台中县| 顺义区| 牙克石市| 临汾市| 岳西县| 德惠市| 绥棱县| 兴安盟| 延边| 潮州市| 丰城市| 商河县| 繁峙县| 同德县| 大竹县| 泗阳县| 大姚县| 尤溪县| 堆龙德庆县|