自動搶票之 12306 搶票篇
本文轉(zhuǎn)載自微信公眾號「Python技術(shù)」,作者派森醬。轉(zhuǎn)載本文請聯(lián)系Python技術(shù)公眾號。
大家好,這一篇是 12306 的自動預(yù)訂車票篇,前篇已經(jīng)擼完了 12306 的自動登錄。小編希望小伙伴們能多給幾個贊,以示鼓勵。
查詢車票
首先 selenium 打開到 https://kyfw.12306.cn/otn/leftTicket/init 購票查詢車票頁面。這個頁面只有 2 個需要要模擬人工的操作:
填寫 出發(fā)地、目的地、出發(fā)日,點擊查詢按鈕
12306 的出發(fā)地、目的地、出發(fā)日的文本框用下面的代碼自動寫入似乎是沒什么作用的。
- ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
- self.driver.get(ticket_url)
- self.wait.until(self.findElement(By.ID, 'fromStationText')).send_keys('上海')
- self.wait.until(self.findElement(By.ID, 'toStationText')).send_keys('常州')
- self.wait.until(self.findElement(By.ID, 'train_date')).send_keys('2021-07-23')
- self.wait.until(EC.visibility_of_element_located((By.LINK_TEXT, '查詢'))).click()
只能另辟蹊徑了。在頁面將目的地、出發(fā)地、出發(fā)日 填入,點擊查詢查詢,驚喜的發(fā)現(xiàn)在 F12 控制面板下 cookie 中存放了日期值。
可是沒有看到出發(fā)地和目的地的漢字,猜測可能這些漢字被編碼過了,在編碼網(wǎng)站解析一番。
于是就可以照貓畫虎將編碼過的目的地、出發(fā)地、出發(fā)日設(shè)置到 cookie 中,并刷新頁面。
- self.driver.add_cookie({'name': '_jc_save_fromStation', 'value': '%u5E38%u5DDE%2CCZH'}) #常州
- self.driver.add_cookie({'name': '_jc_save_toStation', 'value': '%u4E0A%u6D77%2CSHH'}) #上海
- self.driver.add_cookie({'name': '_jc_save_fromDate', 'value': '2021-08-02'})
- self.driver.refresh()
- # 一個溫馨提示彈窗
- self.wait.until(self.findElement(By.LINK_TEXT, '確認(rèn)')).click()
- self.wait.until(self.findElement(By.LINK_TEXT, '查詢')).click()
這時就將車票刷新出來了。
找到車次所在的行,點擊預(yù)定
這里用 XPath 語法找到車次所在的預(yù)訂單元格,用判斷瀏覽器地址是否改變的方式判斷是否進(jìn)入到預(yù)訂頁面。
- # 是否進(jìn)入預(yù)訂頁面
- while self.driver.current_url == ticket_url:
- self.wait.until(self.findElement(By.LINK_TEXT, '查詢')).click()
- time.sleep(2)
- try:
- a = self.driver.find_element_by_xpath("//tr[@datatran='K1511']/preceding-sibling::tr[1]/child::node()[last()]/a")
- if a.text == '預(yù)訂':
- break
- except Exception as e:
- print("沒有車次")
- a.click()
預(yù)訂
在預(yù)訂頁面就簡單了,只需要選擇乘車人和票種、席別。將這些信息定義在數(shù)組中,有幾個乘車人就定義幾個數(shù)組元素。
- passengers = ['xxx']
- ticketType = ['成人票']
- seatType = ['硬座(¥28.5)']
- for index, p in enumerate(passengers, 1):
- self.driver.find_element_by_xpath("//label[text()='"+p+"']/preceding-sibling::input[1]").click()
- selectTicketType = Select(self.driver.find_element_by_id('ticketType_' + str(index)))
- selectTicketType.select_by_visible_text(ticketType[index - 1])
- selectSeatType = Select(self.driver.find_element_by_id('seatType_' + str(index)))
- selectSeatType.select_by_visible_text(seatType[index - 1])
- self.driver.find_element_by_id('submitOrder_id').click()
- self.driver.find_element_by_id('qr_submit_id').click()
到這里就可以使用手機(jī)支付火車票了。
總結(jié)
兩篇文章寫完了 12306 的搶票軟件,大伙們只需要按照自己的需稍微的修改一下腳本,就可以在逢年過節(jié)搶搶搶了。