Python 2.7
IDE Pycharm 5.0.3
具體環(huán)境只洒,Selenium及PhantomJS使用等看我前一篇博客
Python+Selenium+PIL+Tesseract真正自動識別驗證碼進行一鍵登錄
吐槽
自從我欠圖書館6塊錢的過期書后宪拥,立馬要寫一個自動續(xù)約的小工具壓壓驚
目的
自動實現(xiàn)圖書館借書籍的書單截圖卦羡,并一鍵續(xù)約全部書籍沛贪,我登錄校圖書館的目的無非就這兩個咯镜会,我才不去預約沒有的書呢--反正沒有一次預約成功過0.0
實現(xiàn)方法
Selenium+PhantonJS自動化腳本執(zhí)行
實現(xiàn)方案
1.采用Firefox瀏覽器進行模擬登錄度宦,這個比較酷炫把宪潮,可以看著瀏覽器自己在那邊跑,歡快的停不下來盖淡。年柠。。
2.調用PhantomJS.exe褪迟,不展現(xiàn)瀏覽器的運作冗恨,直接在cmd窗口跑(用pyinstaller打包成exe后有cmd窗)
方案實現(xiàn)過程
1.采用Selenium+Firefox方式:
先來個最后成品動圖:
(自從剪成動圖之后,根本停不下來味赃。更加生動形象有木有O颇ā)
然后來程序代碼--主模塊(被調用模塊,也可單獨執(zhí)行)
# -*- coding: utf-8 -*-
#Author:哈士奇說喵
from selenium import webdriver
import time
#shift-tab多行縮進(左)
print 'please wait...system loading...'
#reload(sys)
PostUrl = "http://lib.hrbeu.edu.cn/#"
driver=webdriver.Firefox()#用瀏覽器實現(xiàn)訪問
#driver = webdriver.PhantomJS(executable_path="phantomjs.exe")#沒用瀏覽器
driver.get(PostUrl)
elem_user = driver.find_element_by_name('number')
elem_psw = driver.find_element_by_name('passwd')
#選擇我的圖書館心俗,點擊后才能看到輸入賬號密碼
click_first = driver.find_element_by_xpath("http://ul[@id='imgmenu']/li[4]")
click_first.click()
elem_user.send_keys('S315080092')
elem_psw.send_keys('xxxxxxxxx')
#點擊登錄
click_second = driver.find_element_by_name('submit')
click_second.click()
print 'log in...'
time.sleep(1)
#定位新頁面元素傲武,將handle重定位即可
driver.switch_to_window(driver.window_handles[1])#定位彈出的第一個頁面,也就是當前頁面
#sreach_window = driver.current_window_handle #此行代碼用來定位當前頁面#不可行
driver.find_element_by_xpath("/html/body/div[4]/div/div/ul/li[3]/a").click()
driver.save_screenshot('image_booklist_firefox.jpg')
print 'turning to the mylib...'
time.sleep(1)#搜索結果頁面停留片刻
#driver.switch_to_window(driver.window_handles[1])
#沒有跳出新窗口就是在同一頁面的城榛!
for i in range(2,30):#這里限定是29本書揪利,一般我們都不會借那么多書的
try:
#driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/table/tbody/%s/td[8]/div/input"%('tr[%s]'%i)).click()#下面的比較好理解
driver.find_element_by_xpath("/html/body/div[4]/div/div[2]/table/tbody/tr[%s]/td[8]/div/input"%i).click()
print 'renewing...the %d\'th book renewed '%(i-1)
except:
print '%d books have been renewed !'%(i-2)
a=i-2
time.sleep(4)
driver.save_screenshot('image_done_firefox.jpg')
print 'the picture is saving...'
print 'done!'
break
time.sleep(1)
driver.close()
driver.quit()
調用上述模塊的主執(zhí)行函數(shù)(其實就是為了封裝上述模塊而已,封裝成gui界面吠谢,為后續(xù)的打包做準備土童,如何打包請見博文將自己的python程序打包成exe(秀同學一臉吶)
):
# -*- coding: utf-8 -*-
#Author:哈士奇說喵
from Tkinter import *
import tkMessageBox#執(zhí)行gui窗
import time
def check_renew():
print 'checking and renewing...'
tkMessageBox.showinfo('提示','即將開啟裝逼模式,請確認已安裝Firefox瀏覽器')
#time.sleep(4)
import Selenium_PhantomJS_lib_firefox
tkMessageBox.showinfo('提示','已執(zhí)行成功!\n(截圖已保存于程序目錄)')
#主框架部分
root = Tk()
root.title('圖書館查詢續(xù)約(哈爾濱工程大學專版)--by 哈士奇說喵')
label=Label(root,text=' 圖書館一鍵查詢與續(xù)約Firefox版本 (?ω?) ')
button_check=Button(root,text='查詢書單并續(xù)期━Σ(?Д?|||)━開啟Firefox有形裝逼模式 ',background='green',command=check_renew)
label.pack()
button_check.pack()
root.mainloop()
實現(xiàn)效果如圖所示:
程序中的注釋相信可以把程序解釋的差不多了把工坊。献汗。。王污。
遇到問題和解決方案
1.selenium對新頁面元素無法定位拋出
NoSuchElementException: Message: Unable to locate element
錯誤罢吃,導致無法進行對新的界面進行點擊操作。
1.解決方案:專門寫了一篇博客昭齐,請見
解決Selenium彈出新頁面無法定位元素問題(Unable to locate element)
2.對打包后的版本無法運行尿招,拋出如圖錯誤Errno 10054
2.解決方案:暫未找到解決方案,exe文件不可用,程序執(zhí)行可用
3.對未知書籍數(shù)目重復點擊操作就谜,代碼冗余
3.解決方案:因為點擊續(xù)借按鈕的元素每個都不一樣怪蔑,通過觀察可知其中的規(guī)律,之后就知道在那進行修改丧荐,但是缆瓣,光修改的話,十本書就有十個相似的代碼串虹统,很不pythontic弓坞,所以,采用格式化字符串的方式進行for循環(huán)帶入车荔,方便又漂亮渡冻!
4.使用了1中的解決方案還是不能定位元素
4.可能查找元素的方式出現(xiàn)錯誤,我現(xiàn)在的使用方法是采用xpath的方式來找忧便,比如說這樣
driver.find_element_by_xpath("/html/body/div[4]/div/div/ul/li[3]/a")
雖然看起來有點長族吻,但是元素相當好找,而且定位很準茬腿,如果采用類似這種driver.find_element_by_xpath("http://ul[@id='imgmenu']/li[4]")
呼奢,我現(xiàn)在還不能很好地駕馭,出錯可能性有點大切平,下次要多進行嘗試。
下篇預告
實現(xiàn)方案二辐董,調用PhantomJS.exe悴品,不展現(xiàn)瀏覽器的運作,直接在cmd窗口跑(用pyinstaller打包成exe后有cmd窗)
PS
科三過了還的看科四简烘,話說老師十八號要帶我去采集數(shù)據(jù)苔严。。孤澎。届氢。「残瘢可能就沒有多少時間整我的愛好了退子。。型将。那么寂祥,應該會從數(shù)據(jù)采集,數(shù)據(jù)挖掘算法方面進行更新七兜,━Σ(?Д?|||)━仍重道遠啊喵
so 丸凭,see you tomorrow!good night!