小年到了,回家抢票太难,用Python做个脚本12306自动查票以及自动购票....

今天就是小年了,听说还有人买不到票?不要慌,今天咱们来用Python做一个自动查票抢票的脚本,24小时抢票,谁抢的过你!源码包已打包文件夹获取方式:点击这里【 Python全套资料】 即可获取。

准备工作

环境

  • Python 3.8
  • Pycharm

插件

谷歌浏览器驱动

模块

需要安装的第三方模块,直接pip安装即可。

requests   # 数据请求模块
prettytable # 打印好看一些
selenium  # 模拟人的行为去操作浏览器

文件素材

city.json文件# 下图素材、视频、代码、插件安装教程我都准备好了,直接在这个q君羊708525271自取就好了

一点小TIPS

12306 每天只能退票三次

查票
购票

建议谷歌或者火狐…

爬虫思路

分析数据来源

车票信息:来源哪个数据包 <车票信息请求那个网站url地址可以得到>

开发者工具:F12

代码实现步骤

1、发送请求, 对于刚刚分析得到url地址发送请求。
2、获取数据, 获取服务器返回响应数据, response
3、解析数据, 提取我们想要车次信息。

# 导入数据请求模块
import requests
# 导入格式化打印
import prettytable as pt
# 导入json
import json
# 导入自动化测试模块
from selenium import webdriver
# 导入账号密码
from password import account, Password
# 导入时间模块
import time
# 导入键盘控制
from selenium.webdriver.common.keys import Keys

打开浏览器。

driver = webdriver.Chrome()

绕过检测机制

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})

输入网址

driver.get('https://kyfw.12306.cn/otn/resources/login.html')

输入账号密码

先找到账号密码输入框, 再进行输入操作。

try:# 输入账号driver.find_element_by_css_selector('#J-userName').send_keys(account)# 输入密码driver.find_element_by_css_selector('#J-password').send_keys(Password)# 点击登陆driver.find_element_by_css_selector('#J-login').click()# 延时driver.implicitly_wait(10)time.sleep(1)

点击弹窗

driver.implicitly_wait(10)  # 延时等待 为了让网页元素加载
time.sleep(1)
driver.find_element_by_css_selector('.btn').click()

点击车票预定

driver.find_element_by_css_selector('#link_for_ticket').click()

选择城市以及时间, 点击查询

driver.find_element_by_css_selector('#fromStationText').click() # 点击输入框
driver.find_element_by_css_selector('#fromStationText').clear() # 清空输入框
driver.find_element_by_css_selector('#fromStationText').send_keys('长沙') # 输入内容
driver.find_element_by_css_selector('#fromStationText').send_keys(Keys.ENTER) # 回车按钮
# 输入到达的城市
driver.find_element_by_css_selector('#toStationText').click() # 点击输入框
driver.find_element_by_css_selector('#toStationText').clear() # 清空输入框
driver.find_element_by_css_selector('#toStationText').send_keys('上海') # 输入内容
driver.find_element_by_css_selector('#toStationText').send_keys(Keys.ENTER) # 回车按钮
# 输入时间
driver.find_element_by_css_selector('#train_date').click() # 点击输入框
driver.find_element_by_css_selector('#train_date').clear() # 清空输入框
driver.find_element_by_css_selector('#train_date').send_keys('2022-11-09') # 输入内容
# 点击查询按钮
driver.find_element_by_css_selector('#query_ticket').click()
# 点击预定
driver.find_element_by_css_selector('#queryLeftTable tr:nth-child(1) .btn72').click()
# 选择乘车人
driver.find_element_by_css_selector('#normalPassenger_1').click()
# 点击提交提单
driver.find_element_by_css_selector('#submitOrder_id').click()
# 选择座位
# driver.find_element_by_css_selector('#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()
# 点击提交
time.sleep(3)
driver.find_element_by_css_selector('#qr_submit_id').click()
driver.find_element_by_css_selector('#qr_submit_id').click()

发送请求, 模拟浏览器对url地址发送请求

# 读取文件 城市字母文件
f = open('city.json', encoding='utf-8')
# f.read() 返回字符串数据类型 把字符串转成json字典数据 --> 根据键值对取值
json_data = json.loads(f.read())
# 输入内容
from_city = input('请输入你要出发城市: ')
to_city = input('请输入你要到达城市: ')
date = '2022-11-09'
# 确定请求链接
url = f'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={json_data[from_city]}&leftTicketDTO.to_station={json_data[to_city]}&purpose_codes=ADULT'
# 模拟伪装 ---> headers 请求头
headers = {# Cookie 用户信息, 表示常用于检测是否有登陆账号'Cookie': '_uab_collina=165650330916153394558455; JSESSIONID=34AFEC7D7370756179A2976A79434D6A; _jc_save_wfdc_flag=dc; _jc_save_fromStation=%u957F%u6C99%2CCSQ; BIGipServerotn=1911030026.24610.0000; BIGipServerpassport=770179338.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; RAIL_EXPIRATION=1668129535127; RAIL_DEVICEID=TbHG0I9N4zNOVXocTOo6JdSREGznbbsYb5f_xQPshKLa1Y8Qx7LbGMu_h4Zwb6MyBOk_1zvlhZn85dlBcC4F1SEL1hwpTWuAkNkA7dSIqQ-dgdZAcoL1jMCS4bWfKSgKEstpGs8BAzfO-ItsTfKkP6YQL9Y24vGA; fo=uyys4j4q4rs7diywCDbOKBwdzYaDJcHjbyEG0hwDDZbF9Swz2dB79o6CCDC_EOHwJ7XidDtuZKQKjz6vYdfE3PDpSX9YvVulaMDDQmKGRPhrjzRZHlNGKC2S6egp70_4PJGqyv770aRXnJgffGRwkABzbJZDDiUtaTyHzatcoZpt_YO-T-dfbdjNQrQ; route=9036359bb8a8a461c164a04f8f50b252; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2022-11-09; _jc_save_toDate=2022-11-07',# User-Agent 用户代理 表示浏览器基本身份信息'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
# 发送请求
response = requests.get(url=url, headers=headers)
# <Response [200]> 表示请求成功了
print(response)

获取数据,获取服务器返回响应数据。

为什么获取response.json() 数据的时候报错?
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 4 (char 3)
一定获取的数据, 不是完整json数据格式

解决方法:

  1. 获取response.text 看数据返回情况
    发现自己获取的数据, 和开发者工具里面所看到不一样 <因为你被反爬了 [要么得不到数据, 要么得到数据不是想要的]>
  2. 因为没有伪装, 加headers 伪装一下

解析数据, 提取我们想要车次信息

response.json()  # 获取响应json字典数据  完整的花括号
response.text  # 获取响应文本数据 字符串数据

根据基础语法知识点: 字典取值 --> 键值对取值, 根据冒号左边的内容[键], 提取冒号有右边的内容[值]

# 实例化一个对象
tb = pt.PrettyTable()
# 输出添加字段名
tb.field_names = ['序号','车次','出发时间','到达时间','耗时','特等座','一等','二等','软卧','硬卧','硬座','无座',
]
# 添加序号 每次循环+1
page = 0
# for循环遍历, 把列表里面元素 一个一个提出来
for i in response.json()['data']['result']:# 先用 split 分割, 再用列表取值: 根据索引位置index = i.split('|')num = index[3]  # 车次start_time = index[8]  # 出发时间end_time = index[9]  # 到达时间use_time = index[10]  # 耗时topGrade = index[32]  # 特等座first_class = index[31]  # 一等second_class = index[30]  # 二等hard_sleeper = index[28]  # 硬卧hard_seat = index[29]  # 硬座no_seat = index[26]  # 无座soft_sleeper = index[23]  # 软卧dit = {'序号': page,'车次': num,'出发时间': start_time,'到达时间': end_time,'耗时': use_time,'特等座': topGrade,'一等': first_class,'二等': second_class,'软卧': soft_sleeper,'硬卧': hard_sleeper,'硬座': hard_seat,'无座': no_seat,}# print(dit)# 添加每行输出内容tb.add_row([page, num, start_time, end_time,use_time,topGrade,first_class,second_class,soft_sleeper,hard_sleeper,hard_seat,no_seat,])page += 1 # 每次循环+1

零基础Python学习资源介绍

👉Python学习路线汇总👈

温馨提示:篇幅有限,已打包文件夹获取方式在:点击这里【 Python全套资料】 即可获取。

image.png

👉Python必备开发工具👈

image.png

温馨提示:篇幅有限,已打包文件夹获取方式在:点击这里【 Python全套资料】 即可获取。

👉Python学习视频600合集👈

image.png
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

image.png

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

👉100道Python练习题👈检查学习结果。

image.png

👉面试刷题👈

image.png

温馨提示:篇幅有限,已打包文件夹获取方式在:点击这里【 Python全套资料】 即可获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37962.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++写的12306抢票软件

写在前面的话 每年逢年过节&#xff0c;一票难求读者肯定不陌生。这篇文章&#xff0c;我们带领读者从零实现一款12306刷票软件&#xff0c;其核心原理还是通过发送http请求模拟登录12306网站的购票的过程&#xff0c;最后买到票。 郑重申明一下&#xff1a;这里介绍的技术仅供…

Python抢票神器

又到了一年一度的抢票大战&#xff0c;本来就辛苦劳累了一年&#xff0c;想着可以早点订到票跟家里人团聚。所以&#xff0c;许多人宁愿多花些钱去找黄牛买票。 但今年各种抢票软件的横行&#xff0c;还有官方出的加速包&#xff0c;导致连黄牛都不敢保证能买到票。你无奈的只能…

chatgpt赋能python:如何利用Python抢票

如何利用Python抢票 Python是一种非常流行的编程语言&#xff0c;可以轻松编写自动化工具。如果你想要在抢票热潮中获得胜利&#xff0c;这篇文章将向你展示如何使用Python编写程序来自动抢票。 抢票原理 在开始编写程序之前&#xff0c;我们需要了解如何抢票。抢票的原理是…

python写一个简单的12306抢票

引言 每逢过年就到了12306抢票高峰期&#xff0c;自己总想研究一下12306购票的流程&#xff0c;虽然网上已经很多资料&#xff0c;但是总比不过自己的亲身体会&#xff0c;于是便琢磨着写一个抢票软件&#xff0c;本人比较熟悉python&#xff0c;所以软件是用python写的。 使…

Python3.6实现12306火车票自动抢票(内含源码)

最近在学Python&#xff0c;刚好过完年啦&#xff01;大家应该都需要买高铁票继续去当打工人了吧&#xff01;所以用Python写了这个12306抢票脚本&#xff0c;分享出来&#xff0c;与大家共同交流和学习&#xff0c;有不对的地方&#xff0c;请大家多多指正。话不多说&#xff…

12306抢票软件实现(二)

近期好多人私信我&#xff0c;能不能需要分享完整代码。为了帮助大家&#xff0c;我以及将代码整理和教学视频我已经上传了CSDN&#xff0c;欢迎私信交流&#xff0c;共同学习共同进步&#xff1a;代码及视频下载地址 求给五星好评&#xff0c;谢谢啦 前面已经介绍了实现登录1…

用 Python 代码自动抢火车票

市场上很多火车票抢票软件大家应该非常熟悉&#xff0c;但很少有人研究具体是怎么实现的&#xff0c;所以觉得很神秘&#xff0c;其实很简单。下面使用Python模拟抢票程序&#xff0c;给大家揭秘抢票到底是怎么回事。 该代码仅供参考&#xff0c;主要用于大家沟通交流&#xff…

python最新抢票脚本

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;&#x1f4e3; 系列专栏&#xff1a;python网络爬虫&…

手把手教你用python一键抢12306火车票(附代码)

哈喽&#xff0c;哈喽~&#xff0c;一年一度的抢火车票大战正式拉开序幕… 然饿大多数人碰到的是这种情况&#xff1a;当你满心期待摩拳擦掌准备抢票的时候&#xff0c;你会发现一票难求&#xff01;想回趟家真难&#xff01; 那么作为程序猿的你&#xff0c;当然要用程序猿的…

chatgpt赋能python:Python怎么抢票?

Python怎么抢票&#xff1f; Python是一种伟大的编程语言&#xff0c;因为它可以使我们的生活更加便利。有10年python编程经验的工程师会告诉你&#xff0c;利用Python编程可以轻松地抢到大热节目或演出的票。本文将介绍使用Python编写抢票机器人的方法。 概述 抢票机器人是…

chatgpt赋能python:Python自动抢票:让你的购票经历更加简单便捷!

Python自动抢票&#xff1a;让你的购票经历更加简单便捷&#xff01; 随着互联网的发展&#xff0c;越来越多的人选择在网上购买火车、飞机等交通工具的票。但是&#xff0c;一些火爆的车次、航班往往在开售后仅仅几秒钟内就被抢完&#xff0c;让很多想出行的人非常苦恼。在这…

基于微信小程序的餐厅点餐软件设计及开发

目 录 摘要 I Abstract II 1 前言 1 1.1 选题背景 1 1.2 研究的目的和意义 1 2 相关技术简介 3 2.1 系统的实现架构 3 2.2 系统使用的技术 3 2.2.1 Eclipse 3 2.2.2 Java 4 2.2.3 MySQL简介 5 2.2.4 微信小程序简介 6 2.3 系统使用的开发环境 6 3 系统需求分析 7 3.1 功能需求 …

餐饮行业移动管理系统—Pad点餐系统

餐饮行业移动管理系统—Pad点餐系统 员工可通过PC端查询或管理饭店信息&#xff0c;即使更新信息&#xff0c;客户可以进行方便快捷的点菜操作。 功能要求&#xff1a; PC端功能&#xff1a;管理菜谱&#xff0c;餐厅&#xff0c;员工&#xff0c;订单信息&#xff1b;服务端…

基于Android移动终端的微型餐饮管理系统的设计与实现2-侧滑菜单

上周发了《 基于Android移动终端的微型餐饮管理系统的设计与实现》第一章,虽然是个简介,但是居然上了首页推荐,还有朋友评论了。写了这么久CSDN,还是第一次有人评论我的文章,真是受宠若惊,长期以来,我一直都以为,我玩的是CSDN单机版。当然,这也说明,我过去写的东西都…

安卓移动开发技术--微信界面设计

1.内容&#xff1a;请根据课程实现App门户界面框架设计&#xff0c;至少包含4个tab页&#xff0c;能实现tab页之间的点击切换&#xff1b; 2.技术&#xff1a;使用布局和分段&#xff0c;对控件进行点击监听 实现界面展示&#xff1a; 一.界面布局分析 1.先对button.xml界面…

移动开发--类vx界面

一、开发目标 创建一个类似vx的界面&#xff0c;具有vx、通讯录、发现、我 四个tab&#xff0c;可通过点击实现切换 二、代码解析 写4个tab&#xff0c;用作vx 、通讯录、发现、我四个界面 一个top.xml 一个bottom.xml 一个framelayout作为容器 mainactivity如下&#x…

【餐厅点餐平台|四】UI设计+效果展示

餐厅点餐平台导航 【餐厅点餐平台&#xff5c;一】项目描述需求分析 https://blog.csdn.net/weixin_46291251/article/details/126414430 【餐厅点餐平台&#xff5c;二】总体设计 https://blog.csdn.net/weixin_46291251/article/details/126422811 【餐厅点餐平台&#xff5…

【餐饮】智慧餐厅原型模板,餐饮APP,餐饮后台管理系统,Axure设计餐饮APP

软件版本&#xff1a;Axure 8.0&#xff08;兼容9和10&#xff09; 作品介绍&#xff1a; 作品包括用户端、员工端以及商户管理&#xff08;后台管理&#xff09; 客户端&#xff1a; 外卖点餐&#xff1a;菜品列表、菜品详情、确认订单、地址管理、修改电话、支付订单 堂食点…

基于Androidstudio餐厅点餐选座系统

完成“餐厅点餐系统”的设计。餐厅点餐系统是一个适用于餐饮行业和消费者的软件&#xff0c;顾客可以使用该系统自动点餐&#xff0c;也可到店后由服务人员点餐&#xff0c;系统管理员进行后台管理。 build.gradle (Module: app) 包含当前项目的applicationId、最小适配的Andro…

【花雕学AI】ChatGPT能用表情包猜电影,你能猜出来吗?揭秘它的神奇「涌现」能力

关于作者斯蒂芬 我是田纳西州纳什维尔的一名科学作家&#xff0c;负责数学、物理学、天文学和癌症研究。我的书Math Art: Truth, Beauty, and Equations 将于 2019 年 4 月出版。我在后院改建的办公室棚子里工作。我是范德比尔特大学的驻校作家&#xff0c;教授科学传播课程。 …