使用Python和Splinter实现12306火车票查询与抢票

有一段时间没有使用Python了,前几天经朋友提起一篇关于用Python实现抢火车票的文章,百度了实现抢火车票的技术细节,网上却有不少资料,也不是新鲜的东西。在了解了一些技术手段,阅读了一些大神的博文后,也尝试实现了一下,代码写得粗糙,纯当娱乐,本文在Windows系统下完成。需要提到的是,抢票过程中的验证码部分只能手动完成。

首先,我需要的工具和组件有:

  • Chrome浏览器
  • 浏览器驱动ChromeDriver
  • Python 3.5
  • Web应用测试工具Splinter

Chrome浏览器可自行下载,其浏览器驱动ChromeDriver可在以下链接找到:http://chromedriver.storage.googleapis.com/index.html?path=2.20/

在官网下载Python,选择Windows x86 executable installer,安装过程中会一同安装IDLE、pip等等,可勾选选项添加Python为环境变量(在Windows cmd下运行Python,需要设置环境变量)。安装完成后,执行:pip install splinter安装Splinter即可。

基本的配置已完成,测试一下,cmd下运行Python,分别键入以下指令:

>>> from splinter.browser import Browser
>>> b = Browser(driver_name="chrome")
>>> b.visit("http://www.qq.com")

可以创建一个基本文件,写入以上三句语句:

在执行后续操作时,需要用到Google Chrome开发者工具,按“F12”或“shift+ctrl+i”呼出。找到Elements选项卡,这里记录了当前页面每个元素的信息,如以下的搜索栏和“百度一下”按键,可选择想要查看的网页要素或位置,Elements会跳转到相应的实现代码。

搜索栏的name = “wd”,”百度一下“按键的id = “su”,在得到这一信息后,可以执行以下三步操作:

1. 输入:b.fill("wd", "splinter")即可在搜索栏搜索splinter。

2. 输入:button = b.find_by_value(u"百度一下")寻找该按键

3. 输入:button.click() 点击该按键

更多操作,可参考splinter的官方文档。。。

下面开始进入12306的网址进行操作:

类似于在百度页面的操作,在用户名和密码栏目中输入个人信息:

b.find_by_text(u"登录").click()
b.fill("loginUserDTO.user_name",username) # username部分输入自己的账号
b.fill("userDTO.password",passwd) # passwd部分输入账号密码

之所以说是半自动抢票,是因为在抢票之前需要手动搜集一些信息,比如手动选择一次出发地点、日期和到达地点等信息,然后F12打开开发者工具,点击Resources,找到cookies选项,可以看到下图所示的内容:

通过cookies可以看到手动选择的出发地点_jc_save_fromStation及其值value,还有出发日期_jc_save_fromData及目的地_jc_save_toStation等内容。其中每个地名会对应一个独占的value,因此如果你是要刷从北京去上海的车票,需要手动先查查北京和上海分别对应的value值,并记录下来,后面有用。

接下来,执行以下指令,添加cookies信息:

b.cookies.add({"_jc_save_fromDate":"2016-01-18"}) # 此处添加出发日期
b.cookies.add({"_jc_save_fromStation":"此处添加各地名所对应的value值"}) # 此处添加出发地
b.cookies.add({u‘_jc_save_toStation‘:‘此处添加各地名所对应的value值‘}) # 此处添加目的地

之后,再次刷新页面时,可以发现浏览器会自动填写之前手动填写的内容,在执行刷票时,这无疑节省了很多时间:

后续的操作也不多了,reload页面,然后寻找页面内的”查询“按钮并点击,再寻找可点击的”预订“按钮,这里有一个问题是可能出现多个班次,因此如果要操作代码去点击某个班次的”预订“按钮,也不困难,使用以下指令即可:

b.find_by_text(u"查询").click()
b.find_by_text(u"预订")[1].click() # 下标1表示买的是可选班次的第二班车

最后执行几句指令自动选取购票人,然后再手动选取验证码图片,即可完成抢票(验证码还是一道不可逾越的鸿沟)。

以上是整个流程,在完整代码中,只需再加入一些基本的循环和判断,所有这些加起来不到100行。整个过程手动输入验证码是不可避免的,除非拥有验证码的数据库,然后在这基础上做一些图像识别的算法,但这会是一个工作量较大的任务。

参考链接:http://www.jb51.net/article/75992.htm

时间: 2024-10-14 19:43:55

使用Python和Splinter实现12306火车票查询与抢票的相关文章

聚合数据iOS SDK 12306火车票查询订票演示示例

1,将聚合数据SDK(JuheApis.framework)添加到你的程序中来,SDK依赖的包包括: 2,在聚合SDK Framework的JHSDKAPIPath.h文件中找到快递查询接口宏,以及字典参数 /* 12306火车票查询订票 *//**@brief 2306火车票查询订票--1.车次查询@param lname string 必填 车次名称,如:G4@param ldtype string 非必填 返回数据的格式,xml或json,默认json*/#define kJHAPIS_L

12306火车票查询爬虫(基于selenium)

今天写一下12306火车票查询的爬虫,新手一个,代码方面可能不是那么整洁,望海涵... 一. 这个火车票爬虫感觉还是有点难度的,一些小细节需要考虑. 二. 还是先讲一下思路:  获得火车票查询URL----->单击'单程'------->点击出发输入框,输入城市,选取站点------>目的地输入同上一步------>点击出发日期那个框,选取出发日期.------>点击"查询"按钮------>前面几步用selenuim实现------>创建几个

python学习教程,12306火车票抢票系统

python学习教程,12306火车票抢票系统 代码展示: 1 ''' 2 在学习过程中有什么不懂得可以加我的python学习交流扣扣qun,934109170,群里有不错的学习教程.开发工具与电子书籍. 3 与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容. 4 ''' 5 import urllib.request as request 6 7 import http.cookiejar as cookiejar 8 9 import re 10 11 i

12306改版之后简单抢票软件的实现(二)完结

上一篇文章讲完了12306网站模拟登陆的部分,看这里 12306改版之后简单抢票软件的实现 现在把后面的步骤全部分析一下. 本文作者 http://www.cnblogs.com/russellwang,转载请标明出处 登录完成要选择买票人的信息,那么怎么获得账户中常用联系人的信息呢?访问这个地址:https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs 访问这个页面需要两个参数, 说一下第二个参数,REPEAT_SUBMIT_TOK

12306火车票查询工具

使用Python实现的火车票查询工具: Usage: ticket.py [-gdtzk] <from> <to> <date> Options: -h,--help 帮助信息 -a 所有 -g 高铁 -d 动车 -t 特快 -z 直达 -k 快速 Demo: ticket.py shenzhen beijing 20161001 -g 1 #!/usr/bin/env python 2 #coding:utf-8 3 import urllib2,re,json 4

12306改版之后简单抢票软件的实现(转载)

又到一年抢票时,各种抢票软件的肆虐让12306不堪重负,最近这几天12306频繁的更换手段来阻止抢票软件. 先来吐槽一下红红的验证码,过年的时候都喜欢用红色来喜庆一下,12306也深刻的表达了他的喜悦之情,又红又大的验证码啊,不过到底跨越了几个维度呢?看起来晕晕的,感觉像在时空里穿梭. 科学告诉我们,牛是色盲,分不出来颜色,但是伟大的黄牛们不是,不知道黄牛们看到鲜红的验证码之后会不会疯了一样的撞向显示器?那场面一定非常壮观 很快红色的验证码消失了,但是,在抢票的每一步都加了一个验证,过滤掉抢票软

12306改版之后简单抢票软件的实现

本文作者 russellwang,转载请标明出处 又到一年抢票时,各种抢票软件的肆虐让12306不堪重负,最近这几天12306频繁的更换手段来阻止抢票软件. 先来吐槽一下红红的验证码,过年的时候都喜欢用红色来喜庆一下,12306也深刻的表达了他的喜悦之情,又红又大的验证码啊,不过到底跨越了几个维度呢?看起来晕晕的,感觉像在时空里穿梭. 科学告诉我们,牛是色盲,分不出来颜色,但是伟大的黄牛们不是,不知道黄牛们看到鲜红的验证码之后会不会疯了一样的撞向显示器?那场面一定非常壮观 很快红色的验证码消失了

聚合数据Android SDK 12306火车票查询订票演示示例 编辑

1.聚合SDK是聚合数据平台,为移动开发者提供的免费数据接口.使用前请先到聚合平台(http://www.juhe.cn/)注册,申请相关数据. 2.下载聚合数据SDK,将开发包里的juhe_sdk_v_1_1.jar拷贝到libs根目录下,将libJuheSDK_v_1_0.so拷贝到libs\armeabi目录下,如图: 3. 根据接口说明文档找到以下方法: Java代码   /** * 获取车次 * * @param name *            车次 * @param jsonCa

练习js——自动化实现12306火车票查询

# !/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2019/12/1 09:03 # @Author : "小多肉" # @Email : [email protected] # @File : task1127.py # @Software: PyCharm import time from datetime import datetime, timedelta from selenium import webdriv