自动抢票之 12306 抢票篇

开发 前端
大家好,这一篇是 12306 的自动预订车票篇,前篇已经撸完了 12306 的自动登录。小编希望小伙伴们能多给几个赞,以示鼓励。

[[412981]]

本文转载自微信公众号「Python技术」,作者派森酱。转载本文请联系Python技术公众号。

大家好,这一篇是 12306 的自动预订车票篇,前篇已经撸完了 12306 的自动登录。小编希望小伙伴们能多给几个赞,以示鼓励。

查询车票

首先 selenium 打开到 https://kyfw.12306.cn/otn/leftTicket/init 购票查询车票页面。这个页面只有 2 个需要要模拟人工的操作:

填写 出发地、目的地、出发日,点击查询按钮

12306 的出发地、目的地、出发日的文本框用下面的代码自动写入似乎是没什么作用的。

  1. ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init' 
  2. self.driver.get(ticket_url) 
  3. self.wait.until(self.findElement(By.ID, 'fromStationText')).send_keys('上海'
  4. self.wait.until(self.findElement(By.ID, 'toStationText')).send_keys('常州'
  5. self.wait.until(self.findElement(By.ID, 'train_date')).send_keys('2021-07-23'
  6. self.wait.until(EC.visibility_of_element_located((By.LINK_TEXT, '查询'))).click() 

只能另辟蹊径了。在页面将目的地、出发地、出发日 填入,点击查询查询,惊喜的发现在 F12 控制面板下 cookie 中存放了日期值。

可是没有看到出发地和目的地的汉字,猜测可能这些汉字被编码过了,在编码网站解析一番。

于是就可以照猫画虎将编码过的目的地、出发地、出发日设置到 cookie 中,并刷新页面。

  1. self.driver.add_cookie({'name''_jc_save_fromStation''value''%u5E38%u5DDE%2CCZH'}) #常州 
  2. self.driver.add_cookie({'name''_jc_save_toStation''value''%u4E0A%u6D77%2CSHH'}) #上海 
  3. self.driver.add_cookie({'name''_jc_save_fromDate''value''2021-08-02'}) 
  4. self.driver.refresh() 
  5. # 一个温馨提示弹窗 
  6. self.wait.until(self.findElement(By.LINK_TEXT, '确认')).click() 
  7.  
  8. self.wait.until(self.findElement(By.LINK_TEXT, '查询')).click() 

这时就将车票刷新出来了。

找到车次所在的行,点击预定

这里用 XPath 语法找到车次所在的预订单元格,用判断浏览器地址是否改变的方式判断是否进入到预订页面。

  1. # 是否进入预订页面 
  2. while self.driver.current_url == ticket_url: 
  3.     self.wait.until(self.findElement(By.LINK_TEXT, '查询')).click() 
  4.     time.sleep(2) 
  5.     try: 
  6.         a = self.driver.find_element_by_xpath("//tr[@datatran='K1511']/preceding-sibling::tr[1]/child::node()[last()]/a"
  7.         if a.text == '预订'
  8.             break 
  9.     except Exception as e: 
  10.         print("没有车次"
  11.      
  12.     a.click() 

预订

在预订页面就简单了,只需要选择乘车人和票种、席别。将这些信息定义在数组中,有几个乘车人就定义几个数组元素。

  1. passengers = ['xxx'
  2. ticketType = ['成人票'
  3. seatType = ['硬座(¥28.5)'
  4. for index, p in enumerate(passengers, 1): 
  5.     self.driver.find_element_by_xpath("//label[text()='"+p+"']/preceding-sibling::input[1]").click() 
  6.      
  7.      
  8.     selectTicketType = Select(self.driver.find_element_by_id('ticketType_' + str(index))) 
  9.     selectTicketType.select_by_visible_text(ticketType[index - 1]) 
  10.      
  11.     selectSeatType = Select(self.driver.find_element_by_id('seatType_' + str(index))) 
  12.     selectSeatType.select_by_visible_text(seatType[index - 1]) 
  13.      
  14.     self.driver.find_element_by_id('submitOrder_id').click() 
  15.      
  16.     self.driver.find_element_by_id('qr_submit_id').click() 

到这里就可以使用手机支付火车票了。

总结

 

两篇文章写完了 12306 的抢票软件,大伙们只需要按照自己的需稍微的修改一下脚本,就可以在逢年过节抢抢抢了。

 

责任编辑:武晓燕 来源: Python技术
相关推荐

2013-01-17 10:49:42

2014-01-03 09:15:39

12306抢票360

2018-02-07 17:12:00

2014-12-22 11:07:18

12306

2019-01-09 09:35:41

抢票Python软件

2013-01-22 09:31:33

2013-09-12 11:14:52

假冒1230612306

2013-09-12 11:17:02

2013-12-09 14:21:45

12306抢票浏览器

2018-10-23 11:16:59

12306思路余票

2013-01-22 17:10:42

浏览器技术解析

2018-01-26 10:31:11

抢票软件公平

2018-01-10 15:23:09

2019-12-30 07:00:51

技术研发系统

2013-01-16 09:15:05

2019-09-08 23:00:19

GitHub代码开发者

2013-09-12 10:50:13

猎豹浏览器12306抢票软件

2012-09-19 14:31:44

猎豹浏览器抢票

2015-03-25 10:38:23

漏洞12306图片验证码

2013-01-21 16:02:29

Chrome抢票
点赞
收藏

51CTO技术栈公众号