作者:小成Charles
原創作品
轉載請標注原創文章地址:https://blog.csdn.net/weixin_42999453/article/details/113999110
一、前言
事情是這樣的,由于每天早上去圖書館都要提前在互動吧網站上蹲點搶票,挺麻煩的,然后我老爸說,你怎么不自己寫一個搶票軟體,一句點醒了我,于是這款搶票程式來了,

二、思路設計
對于搶票這樣的程式,難點并不是在寫代碼上,主要難點在于對網站原始碼的分析以及奇奇怪怪的情況的處理,這里選用Python作為腳本語言,我們利用selenium+chromeDriver模擬瀏覽器的登錄,因為我們是用電腦模擬人點擊,所以我們要知道訂票所需要的所有步驟,這樣才能自動化處理,
在購買一張票的所有流程主要就是登錄然后購買,我們要先登錄然后瀏覽器才會記住登錄資訊的cookies,才能正常購買,
三、登錄頁面分析
這里我登錄使用的網站利用瀏覽器模擬到移動端頁面,因為移動端的頁面比較簡單,通過檢查原始碼,我們很快就找到了兩個輸入框以及登錄按鈕對應的位置如圖所示標簽位置

這里很簡單,獲取到輸入框的元素之后,send_keys()來輸入賬號密碼,之后對登錄元素進行click()就可以實作登錄
def login(browser):
browser.get('https://login.hudongba.com/login/?redirectUrl=https%3A%2F%2Fwww.haudongba.com%2Fcoupon_center')
input_account = browser.find_element_by_class_name('zc_sjK')
input_pswd = browser.find_element_by_class_name('zc_sjK.mmkTxt')
btn_log = browser.find_element_by_css_selector('.blueBtn a')
input_account.send_keys('your account')
input_pswd.send_keys('your password')
btn_log.click()
四、購買頁面分析
首先我們打開需要搶票的頁面,打開F12檢查網頁源代碼,找到報名按鈕的標簽元素,然后模擬點擊,點擊之后會出現二維碼,二維碼下面繼續報名的鏈接點進去就可可以進入下一步了,這里用class來確定按鈕位置,可以寫成 browser.find_element_by_class_name('myApply'),然后就是鏈接的位置,同樣用class來確定位置browser.find_element_by_class_name('font-3')

然后進入下一步就是填寫個人資訊的界面了,這里如圖所示,我們發現如圖右下角的css代碼對應的是這三個input輸入框,那我們可以利用css選擇器來獲取這三個input元素,可以寫成browser.find_elements_by_css_selector('.pop_massage .dan_h .inpoutK input'),這樣獲得的是一個陣列,接下來對每個陣列send_keys()進行傳值,

接下來我們需要點擊立即報名按鈕,這里我們在原始碼中找到立即報名的按鈕標簽對應的css代碼塊,同樣的我們可以利用css選擇器來定位對應的元素,這里就可以寫成browser.find_element_by_css_selector('.moreApplyWrap .submit a')
然后對元素進行click()處理就可以報名成功了!

上面對網頁簡單的分析之后,我們看看完整代碼,注意這里利用的sleep主要是為了保證所有元素被完全加載后再進行呼叫,btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color')這里是獲取了我要報名的按鈕的顏色 ,因為如果是灰色的話說明當前不允許購票,下面進入回圈,不斷地重繪頁面獲取按鈕顏色,直到為指定的藍色,回圈跳出,
def buy_ticket(browser):
browser.get('https://www.hudongba.com/party/ppfb5.html?hdb_pos=manager_info')
# click continue buy
time.sleep(1)
btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color')
print(btn_color)
# if the color is not blue ,it won`t be allowed you to order
# then you can refresh the website
while 1:
if btn_color == 'rgba(0, 153, 233, 1)':
break
else:
browser.refresh()
time.sleep(1)
btn_color = browser.find_element_by_class_name('myApply').value_of_css_property('background-color')
browser.find_element_by_class_name('myApply').click()
btn_next = browser.find_element_by_class_name('font-3')
btn_next.click()
# input information
time.sleep(1)
input_elements = browser.find_elements_by_css_selector('.pop_massage .dan_h .inpoutK input')
print(input_elements)
input_elements[0].clear()
input_elements[1].clear()
input_elements[2].clear()
input_elements[0].send_keys("小成Charles")
input_elements[1].send_keys("123456785555")
input_elements[2].send_keys("45645646464456211")
# click blueBtn
blue_btn = browser.find_element_by_css_selector('.moreApplyWrap .submit a')
print(blue_btn)
blue_btn.click()
# jude success or failed
time.sleep(1)
FLAG = browser.find_element_by_class_name('centerMsg')
if len(FLAG) != 0:
print("success")
else:
print("failed")
五、主函式代碼分析
這里首先是初始化chrome瀏覽器,設定瀏覽器頭標簽為移動端user-agent,移動端代碼實作登錄模塊,呼叫過login函式之后,再把瀏覽器識別符號換回成PC端,用來實作購票頁面的模塊(實踐操作發現購票模塊的移動端有些bug),這里browser.execute_cdp_cmd()實作將瀏覽器標識進行轉換,然后再運行buy_ticket(browser)函式塊就又是PC端了!
if __name__ == '__main__':
# send_emails()
USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.' \
'4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--User-Agent=" + USER_AGENT)
#chrome_options.add_argument('--headless')#這里實作將啟動頁面影藏
browser = webdriver.Chrome(options=chrome_options)
login(browser)
# switch the chrome to PC option then open the URL
browser.execute_cdp_cmd("Emulation.setUserAgentOverride", {
"userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0"
})
buy_ticket(browser)
六、總結
這個程式本身是有很多bug的,原理上你需要對每個獲取元素代碼塊進行例外捕獲處理,以及例外后應該做出怎樣的判斷,完善代碼后如果可以的話可以把程式放到服務器上24小時不斷運行,這樣才能真正實作自動搶票!
作者:小成Charles
原創作品
轉載請標注原創文章地址:https://blog.csdn.net/weixin_42999453/article/details/113999110
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262930.html
標籤:python
