自动抢票之 12306 抢票篇

来源:Python 技术「ID: pythonall」

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

查询车票

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

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

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

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()

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

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

于是就可以照猫画虎将编码过的目的地、出发地、出发日设置到 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, '确认')).click()

self.wait.until(self.findElement(By.LINK_TEXT, '查询')).click()

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

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

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

# 是否进入预订页面
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 == '预订':
            break
    except Exception as e:
        print("没有车次")
    
    a.click()

预订

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

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()

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

总结

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

(0)

相关推荐

  • Python制作【大麦网】自动抢票程序

    前言 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域. 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 那么,今天带大家用Python ...

  • 使用Appium爬取当当网App的所有数据

    第一时间获取 Python 技术干货! 阅读文本大概需要 10 分钟. 01 目标 场景:有时候通过传统的方法去爬一些 Web 网页或者 APP,受限于对方的反爬方案,很难爬到想要的数据,这个时候可以 ...

  • 自动抢票之 12306 登录篇

    来源:Python 技术「ID: pythonall」 逢年过节 12306 的票总是要靠抢,前几天小编就在抢周一去上海的票,实在是抢不到呀,就撸了一个自动抢票的脚本. 抢票的思路就是使用 selen ...

  • “端午节”及节假日回家必看12306抢票攻略

    今日开卖"端午节"的火车票,早上8点起床抢票,至今无果,由于踩了多次12306的坑,所以写了这个攻略,仅供大家参考.作为产品经理这么多年了,我一直在抱怨订不到票,因为我们从未研究过 ...

  • 12306抢票时间点是多少

    铁路12306抢票时间是几点,当我们需要乘坐火车或者高铁出行时,需要在官方售票途径铁路12306购买,根据出发的起始地按时间放票,那怎么知道自己需要出行的车票什么时候可以抢票呢?下面就和小编一起来看看 ...

  • 全网首发:12306抢票算法大曝光?(十张图搞定)

    前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识. 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人. 相信大家都有过抢票.刷票的经验,每年年底, ...

  • 12306抢票系统详解

    12306 抢票,极限并发带来的思考: 虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会. 尤其是春节期间,大家不仅使用 12306,还会考虑"智行"和 ...

  • 这票,机构抢爆了!!

    超短的极大幸运在于,大部分时候,无论大盘如何,只需凭借你异人的嗅觉,捕捉到聪明资金的进攻方向.在进攻意图显山露水之时,跟随入场,便可赚取收益. 超短的极大不幸在于,大部分时候,诱惑太多,所有的形态都被 ...

  • 曹操喜欢抢别人老婆,一大票“人妻”里面,哪个令他损失最惨重?

    "曹操爱人妻,东吴控萝莉,蜀汉全是基",相信很多喜欢三国的朋友都听过这句话. 曹操爱人妻的确是真的,他有记录的妻妾共16位,没记录的还有多少就不知道了.其中至少有3位是别人之妻,杜 ...

  • 票再难抢,也想回家

    新年将至,身边的同事在交流抢票心得,除了摩拳擦掌准点蹲守,还一张票花50元托机构帮忙抢,但好多人仍未抢到票,于是他们开始计划备选方案,实在抢不到票就几个人一起轮流开车回家. 反正买没买到票都是要回家过 ...

  • 过年回家的票要怎样抢才更容易抢到?

    这一段时间,只要与朋友聊天,"买票"的事一定会被提到-- 我实话实说:么有买到.更确切地说是:还没开始买[无奈苦笑脸].感觉自己一副不打算回家的样子. 其实呢~是我不知道如何买票了 ...