要过年了,12306监控抢购车票软件已经写好了,亏我Python学得好

目录

一、效果展示

二、代码详解

1 导入库

2 确定好购票基本信息

3 登录12306

4 模拟滑动滑块

5 处理疫情特殊要求

6 点击购票并填写出发地、目的地、出发时间

7 锁定车票

三、实现监控购买

注意

环境

代码

你有没有感觉国庆、春节等长假火车票很难抢?各大互联网公司都推出了抢票服务,只要在手续费上加钱,就能增加抢票机会。一些火车票代售点和一些加速购票软件表示,只要支付100元的手续费,就可以优先帮助购票。

[En]

Do you have the feeling that it is very difficult to grab train tickets during the long holidays such as National Day and Spring Festival? All the major Internet companies have launched ticket grabbing services, which can increase the chances of getting tickets as long as they add money to the service charge. Some train ticket outlets and some accelerated ticket buying software say that as long as you pay a service charge of 100 yuan, you can give priority to help get the ticket.

本文将与您一起探索抢票软件背后的原理。

[En]

This article is with you to explore the principles behind the ticket-grabbing software.

许多人向蟒蛇学习,不知道从哪里开始。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Many people learn from pythons and don't know where to start.</font>*</details>

很多人学习寻找python,掌握了基本语法之后,不知道在哪里案例上手。

许多可能已经了解此案的人并没有学习到更高级的知识。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>Many people who may already know the case do not learn more advanced knowledge.</font>*</details>

这三类人,我为你提供了一个很好的学习平台,免费获取视频教程、电子书以及课程源代码!<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>These three categories of people, I provide you with a good learning platform, free access to video tutorials, e-books, as well as course source code!</font>*</details>

QQ群:101677771

欢迎加入,一起讨论学习

一、效果展示

在正式进入代码解释之前,我们先来看看这篇文章的实施效果。

[En]

Before officially entering the code explanation, let’s take a look at the implementation effect of this article.

如果不是为了演示效果,只需在最终确定阶段添加延迟点击确定,应该可以在45秒内锁定一张票,只要在30分钟内支付即可。

[En]

If it is not to demonstrate the effect, just add a delay click OK in the final determination phase, you should be able to lock a ticket in less than 45 seconds, as long as you pay within 30 minutes.

二、代码详解

本节将详细解锁抢票软件如何模拟登录网站并自动购票。为了让大家看得更清楚,部分代码并不是写成函数,只需运行裸代码,方便有购票需求的朋友使用软件购票。

[En]

This section will unlock in detail how the ticket-grabbing software simulates logging in to the website and buys tickets automatically. In order to show you more clearly, part of the code is not written as a function, just run naked code, so that friends who need to buy tickets can use software to buy tickets.

1 导入库

首先导入本文需要加载的库,如果你有些库还没有安装,导致运行代码时报错,可以在Anaconda Prompt中用pip方法安装。

<span class="hljs-keyword">import json
<span class="hljs-keyword">import time
<span class="hljs-keyword">from captcha <span class="hljs-keyword">import *
<span class="hljs-keyword">from selenium <span class="hljs-keyword">import webdriver
<span class="hljs-keyword">from selenium.webdriver.common.<span class="hljs-keyword">by <span class="hljs-keyword">import By
<span class="hljs-keyword">from selenium.webdriver.support <span class="hljs-keyword">import wait
<span class="hljs-keyword">from selenium.webdriver.common.keys <span class="hljs-keyword">import Keys
<span class="hljs-keyword">from selenium.common.exceptions <span class="hljs-keyword">import NoSuchElementException
<span class="hljs-keyword">from selenium.webdriver.common.action_chains <span class="hljs-keyword">import ActionChains
<span class="hljs-keyword">from selenium.webdriver.support <span class="hljs-keyword">import expected_conditions <span class="hljs-keyword">as EC
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

2 确定好购票基本信息

导入库后,在python代码中填写你购票的基本信息。

<span class="hljs-attr">purpose = <span class="hljs-string">'ADULT'               </span></span>

本文预订的是2021年9月21日从深圳到长沙南的高铁票,你可以根据自己的实际需要进行调整。由于有些班次的时间过早或过晚,买了也很不方便,所以可以在trains中挑选出你满意的班次进行购票。在这里需要提醒大家,我之前在尝试代码时碰到的坑,那就是时间中如果有个位数要在前面填0。比如2021年9月2日,你在填写购票日期date时要写成’2021-09-02’,否则在运行代码时日期总是填不进去。

3 登录12306

确定好购票的基本信息后,就可以应用python模拟登录12306了,代码如下:

options = webdriver.ChromeOptions()
options.add_argument(<span class="hljs-string">"--disable-blink-features=AutomationControlled")
browser = webdriver.Chrome(options=options)
browser.maximize_window()
login_url = <span class="hljs-string">'https://kyfw.12306.cn/otn/resources/login.html'
</span></span>

整体思路是:

1.应用python模拟调用google浏览器;

2.输入12306网址;

3.等网页加载完全后点击账户密码登录;

4.找到账号密码的id,把账户密码信息填充进去;

5.找到登录id,模拟点击登录按钮。

在这一部分中,需要注意两点。

[En]

Two points should be paid attention to in this section.

一、要在python安装目录中放和google版本匹配的chromedriver,供python调用。

二、要学会填写账户密码信息的id。

首先,在google浏览器中输入12306登录网址:

中国铁路12306

然后点击账号密码登录,出现如下界面:

[En]

Then click the account password to log in, and the following interface will appear:

然后点击红色框中的三个点,找到更多工具,点击开发者工具,出现如下界面:

[En]

Then click the three points in the red box to find more tools, click developer tools, and the following interface will appear:

点击红色框中的箭头,将鼠标移到账户框上,出现如下界面:

[En]

Click the arrow in the red box, move the mouse over the account box, and the following interface will appear:

右边变灰的框里就会出现对应的id,点击账号框,再把鼠标移动到右边变灰的字符上去,点击右键,会出现copy element的选项,复制下来即可。

<input type="<span" class="hljs-string">"text" <span class="hljs-keyword">class=<span class="hljs-string">"input" id=<span class="hljs-string">"J-userName" placeholder=<span class="hljs-string">"&#x7528;&#x6237;&#x540D;/&#x90AE;&#x7BB1;/&#x624B;&#x673A;&#x53F7;" style=<span class="hljs-string">"height: 44px; line-height: 44px; outline: black 0px;" aria-label=<span class="hljs-string">"&#x8BF7;&#x8F93;&#x5165;&#x7528;&#x6237;&#x540D;&#xFF0F;&#x90AE;&#x7BB1;&#xFF0F;&#x624B;&#x673A;&#x53F7;" title=<span class="hljs-string">"&#x8BF7;&#x8F93;&#x5165;&#x7528;&#x6237;&#x540D;&#xFF0F;&#x90AE;&#x7BB1;&#xFF0F;&#x624B;&#x673A;&#x53F7;">
</span></span></span></span></span></span></span>

发现了吗?源代码input_name中要填写的
browser.find_element_by_id(‘J-userName’)内容,即为id=”J-userName”中的信息。

4 模拟滑动滑块

输入用户名和密码后,点击立即登录,将出现以下滑块验证要求。

[En]

After entering the user name and password, click to log in now, the following slider verification requirements will appear.

运行以下代码以拖动滑块进行验证。

[En]

Run the following code to drag the slider to verify.

<span class="hljs-attr">browser.implicitly_wait(5)
</span>

其中,browser.implicitly_wait(5)表示隐性等待5秒,track中放的是滑块拉动的距离。

5 处理疫情特殊要求

完成滑块验证要求后,将出现如下疫情特殊要求:

[En]

After completing the slider verification requirements, the following epidemic special requirements will appear:

使用以下代码单击OK。

[En]

Click OK with the following code.

 <span class="hljs-selector-tag">browser<span class="hljs-selector-class">.implicitly_wait(<span class="hljs-number">5)
<span class="hljs-selector-tag">browser<span class="hljs-selector-class">.find_element_by_xpath(<span class="hljs-string">'/html/body/div[5]/div[2]/div[3]/a')<span class="hljs-selector-class">.click()
<span class="hljs-selector-tag">time<span class="hljs-selector-class">.sleep(<span class="hljs-number">2)
#&#x75AB;&#x60C5;&#x7279;&#x6B8A;&#x8981;&#x6C42;
</span></span></span></span></span></span></span></span></span></span>

browser.find_element_by_xpath和id的区别是,在右键复制时要copy XPath或copy full XPath。

6 点击购票并填写出发地、目的地、出发时间

下一步,选择购票,填写出发、目的地、出发时间等信息。

[En]

The next step is to choose to buy a ticket and fill in the departure, destination, departure time and other information.

browser.find_element_by_xpath(<span class="hljs-string">'//*[@id="J-chepiao"]/a').click()
browser.find_element_by_xpath(<span class="hljs-string">'//*[@id="megamenu-3"]/div[1]/ul/li[1]/a').click()
browser.find_element_by_xpath(<span class="hljs-string">'//*[@id="qd_closeDefaultWarningWindowDialog_id"]').click()
</span></span></span>

得到的结果如下:

这里需要注意的是我调用了两遍input_info函数,因为12306可能采取了一些反爬措施,一遍输入进去后查不出东西,显示为灰色。

7 锁定车票

最后是依次查找trains中的车次是否有票,有的话点击购买锁定车票。

 trList = browser.find_elements_by_xpath(<span class="hljs-string">".//tbody[@id='queryLeftTable']/tr[not(@datatran)]")
<span class="hljs-keyword">for <span class="hljs-keyword">tr in trList:
    trainNum = tr.find_element_by_class_name(<span class="hljs-string">"number").text
    <span class="hljs-keyword">if trainNum in trains:
        leftTicket = tr.find_element_by_xpath(<span class="hljs-string">".//td[4]").text
        <span class="hljs-keyword">print(<span class="hljs-string">'leftTicket', leftTicket)
        <span class="hljs-keyword">if leftTicket == <span class="hljs-string">'&#x6709;' <span class="hljs-keyword">or leftTicket.isdigit():
            orderBtn = tr.find_element_by_class_name(<span class="hljs-string">"btn72")
            orderBtn.click()
            browser.implicitly_wait(<span class="hljs-number">5)
            passengerLabels = browser.find_elements_by_xpath(<span class="hljs-string">".//ul[@id='normal_passenger_id']/li/label")
            <span class="hljs-keyword">for passengerLabel in passengerLabels:
                name = passengerLabel.text
                <span class="hljs-keyword">if name in names:
                    passengerLabel.click()
            browser.implicitly_wait(<span class="hljs-number">20)
            </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

所以,如果你有特别心仪的车次,可以在trains中放在最前面,依次填写觉得还行的车次。至此,应用python解锁抢票软件背后的原理已讲解完毕,感兴趣的朋友可以自己跟着本文实现一遍。

12306不定期会更新买票界面,所以过一段时间可能之前的代码就要进行一些调整,需要自己弄清里面的原理,才可以以不变应万变。本文的代码没有进行高级的封装,只为大家能更清楚地了解每一步,能在抢票高峰期买到自己心仪的票。

它也很基础,没有进一步调短时间的限制,感兴趣的朋友可以自己学习,如果你有什么问题,可以和我交流。

[En]

It is also very basic, there is no further tuning to shorten the time limit, interested friends can study by themselves, if you have any questions, you can communicate with me.

三、实现监控购买

原来的代码只能实现购票,我修改了代码,增加了监控和抢票成功推送功能。

[En]

The original code can only achieve ticket purchase, I modified the code to add monitoring and ticket-grabbing successful push function.

需要自行输入12306账号、密码,购买车次、时间、出发站、目的站、server酱key(Server酱·Turbo版 (ftqq.com)去申请)
经测试,可以成功购票,但存在以下问题。

[En]

It has been tested that the ticket can be purchased successfully, but there are the following problems.

注意

1.登录测试过多可能会导致滑块验证失败,可自行点击刷新,即可自动执行后续代码(懒得写刷新验证了,只要不是多次运行,一般不会有这个问题)

2.main()中,买票buy那一块,因为我是要抢票,等待时间设置为2,如果是监测,建议设置时间长一点,因为有可能被反爬

3.买票提交按钮可能会有bug,于是我在main中增加了一次选择来确保。但无论如何,进入提交页面你都会收到微信提示,为了保险,建议去看一下是否真的提交了,手动提交也不是不可以。

4.多人买票请在buy()函数下names里填入

5.代码中那么多**code,是我用来标记这段代码是否执行成功,如果没有成功就重复执行,如果code=0,代码没成功,再从头执行,gmcode和code感觉有点重复了,但是,管他呢,能运行就行了, 滑稽.jpg

6.我只是个业余程序猿,代码改的丑陋,我尽量写的通俗易懂了,大佬勿喷。

环境

(吃这段代码需要一些基础知识,初学者估计不多见)

[En]

(some basic knowledge is required to eat this code, and it is estimated that it is rare for beginners)

  • python3
  • webdriver

以及一些库,我用pycharm,没有的库可以直接导入
还有,我觉得最主要的就是webdriver,自己有的话更好,配置的话可能需要很久时间,也挺麻烦的

代码

Original: https://www.cnblogs.com/sn5200/p/15802626.html
Author: Python可乐的呀
Title: 要过年了,12306监控抢购车票软件已经写好了,亏我Python学得好

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/510248/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • networkx 笔记:pagerank

    理论部分可参考:李宏毅线性代数笔记 10: PageRank_UQI-LIUWJ的博客-CSDN博客 1 构造图 networkx相关部分可参考:python库整理:network…

    Python 2023年8月26日
    051
  • Django3 快速入门

    目录 一、环境安装 1、安装python 2、安装Django3 3、安装mysqlclient 二、项目管理 1、新建项目 2、新建app a、修改项目目录下的 fastDjan…

    Python 2023年8月4日
    065
  • 关于代理模型的一些理解

    为什么要使用代理模型? 在实际问题中,优化问题的解空间一般规模较大且复杂,导致求解过程也非常复杂。优化问题逐渐向复杂的 高维、非线性、多极值的昂贵优化问题发展,这类问题的计算时间成…

    Python 2023年9月28日
    051
  • 【数据库迁移系列】从Oracle迁移到openGauss实战分享

    之前的迁移系列中我们介绍了Mysql到openGauss的迁移方法,本篇介绍使用Ora2og工具从Oracle到openGauss数据库的迁移。 文章目录 简介 迁移前准备 * 环…

    Python 2023年9月17日
    038
  • 06 接口测试平台 前端登录接口对接

    别人写的平台再垃圾,也是用来淘汰你的。 代码更新地址:https://github.com/ahu965/api-automator.git Python环境没有的,请自行安装,本…

    Python 2023年8月6日
    074
  • Pandas——掌握DataFrame的常用操作

    Pandas——掌握DataFrame的常用操作 * – 一、查看DataFrame的常用属性 – + 1.1、订单详情表的4个基本属性 + 1.2、siz…

    Python 2023年8月7日
    069
  • 展锐UDX710:MMC概述、SD Card驱动解析及调试

    ; 一、MMC概述 相关定义 符合MMC协议接口的存储器,都称为MMC存储体MMC总线,类似于I2C、SPI总线的一种总线结构使用MMC接口规范(HCI, Multimedia C…

    Python 2023年11月7日
    034
  • Python二级考试试题汇总(史上最全)

    Python二级考试试题(一) 表达式 1001 == 0x3e7 的结果是:AfalseBFalseCtrueDTrue正确答案: B 执行以下程序,输入”93pyt…

    Python 2023年8月1日
    054
  • Scrapy-redis 实现分布式

    概念:搭建一个分布式的机群,让其对一组资源进行分布式爬取。作用:提升爬虫的效率 1.安装scrapy-redis的组件2.scrapy-redis组件的作用: 可以给原生的scra…

    Python 2023年10月6日
    042
  • 【seaborn】sns.set() 绘图风格设置

    目录 1. sns.set() 函数 2. 参数 style 指定的5种默认风格 * 1) sns.set(style=’white’) 2) sns.se…

    Python 2023年8月1日
    088
  • 利用matplotlib绘制蓝丁格尔玫瑰图的案例

    一、概念介绍 蓝丁格尔玫瑰图,又称为极坐标区域图,鸡冠花图。该图由我们的”白衣天使”兼统计学家–Florence Nightingale(佛洛伦…

    Python 2023年9月3日
    060
  • Python 排序算法之归并排序

    归并排序,从中间分割数组,分别调用自身,然后合并这两个有序数组 """ 归并排序 1. 实现合并两个有序数组 2. 根据中间一个元素将数组一分为二,分…

    Python 2023年6月12日
    072
  • 【NumPy】爱因斯坦求和约定

    NumPy方法名称einsum,其全称是Einstein summation convention(爱因斯坦求和约定),又称为爱因斯坦标记法(Einstein notation)。…

    Python 2023年8月26日
    093
  • 除夕最绚丽3D烟花代码(html+音效)

    今天就是除夕了,新年怎么能少得了烟花呢?虽然绝大部分地区禁止燃放烟花,但该欣赏的烟花还是要欣赏滴~~最近整理文件,找到了一份烟花代码,3D特效,今天分享给大家,希望大家喜欢。 话不…

    Python 2023年11月5日
    058
  • 初识设计模式 – 职责链模式

    职责链设计模式(Chain Of Responsibility Design Pattern)的定义是,将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。 同时,将这些接…

    Python 2023年10月15日
    053
  • 使用Sklearn学习决策树

    决策树 文章目录 决策树 * 概述 sklearn中的决策树 sklearn的基本建模流程 分类树 – DecisionTreeClassifier 重要参数说明 + …

    Python 2023年8月3日
    059
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球