听说还有人五一抢不票? 看我用python轻松抢票回家

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

买票回家难?

软件加速包也无用?

看我用python轻松抢票回家!

环境介绍:

软件安装

  • python 3.8

  • pycharm

不会安装的可以文末名片+我获取哦 😎

模块使用

第三方模块(需安装)

  • requests

  • selenium —> pip install selenium==3.141.0 自动化测试模块

  • 谷歌浏览器

  • 谷歌驱动

素材: city.json 城市文件 --> 文末名片获取

win + R 输入cmd 输入安装命令 pip install 模块名

如果出现爆红 可能是因为 网络连接超时 切换国内镜像源

思路分析

查票 <不需要登陆账号>

获取车次信息, 采集车次信息

  • 要是知道请求那个链接能够获取这些数据

    抓包流程: 直接找到对应请求链接

    1. 打开开发者工具: F12 / 鼠标右键点击检查选择network

    2. 点击查询

代码展示

导入模块

# 导入数据请求模块 --> 需要安装 pip install requests
import time
import requests
# 导入输出好看一些
import prettytable as pt
# 导入json
import json
# 导入selenium模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from password import Password, account

“”"

selenium --> 模拟人的行为去操作浏览器:

谷歌浏览器 + 谷歌驱动

  1. 打开浏览器

  2. 访问12306网站 登陆账号密码

  3. 点击预定车票

  4. 输入地址时间点击查询

  5. 选择车次预定

  6. 选择乘车人 / 选择座位

  7. 点击购买预定车票

“”"

  1. 打开浏览器
driver = webdriver.Chrome()

2.1 访问12306网站

driver.get('https://****/otn/resources/login.html')
driver.maximize_window()

2.2 访问输入账号 / 密码 / 点击确定 --> 先定位元素, 再进行操作

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)
  1. 点击预定车票
driver.find_element_by_css_selector('#link_for_ticket').click()
driver.implicitly_wait(10)
  1. 输入地址时间点击查询
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('2023-03-18')
driver.find_element_by_css_selector('#train_date').send_keys(Keys.ENTER)
driver.find_element_by_css_selector('#query_ticket').click()
  1. 预定
driver.find_element_by_css_selector('#queryLeftTable>tr:nth-child(1) .btn72').click()
driver.implicitly_wait(10)
driver.find_element_by_css_selector('#normal_passenger_id > li:nth-child(2) input').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)
try:
    driver.find_element_by_css_selector('#qr_submit_id').click()
    driver.find_element_by_css_selector('#qr_submit_id').click()
except:
    pass
# # 读取文件
# f = open('city.json', encoding='utf-8')
# # 读取
# html_data = f.read()
# # 转换数据类型
# json_data = json.loads(html_data)
# print(json_data)
# # 输入出发地/目的/时间
# from_city = input('请输入你要出发城市: ')
# to_city = input('请输入你要到达城市: ')
# # json_data[from_city] 根据键值对取值
# print(json_data[from_city])
# print(json_data[to_city])
# """
# 发送请求, 模拟浏览器对于url地址发送请求
#     - <Response [200]> 响应对象, 表示请求成功 <对于链接请求成功了>
#     - 提问, 为什么请求成功了, 但是返回的数据, 不是我想要的?
#         因为被识别出来是爬虫程序 --> 没有伪装代码程序
# """
# # 请求链接
# url = f'*****/otn/leftTicket/query?leftTicketDTO.train_date=2023-03-18&leftTicketDTO.from_station={json_data[from_city]}&leftTicketDTO.to_station={json_data[to_city]}&purpose_codes=ADULT'
# # 伪装
# headers = {
#     'Cookie': '_uab_collina=165650330916153394558455; JSESSIONID=D0407D922F603AF3FD2130E6B2D20D09; _jc_save_wfdc_flag=dc; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; RAIL_EXPIRATION=1679280041085; RAIL_DEVICEID=NRnk-Xoxe8E7Ke5-m4bWE6BA-8ci1unAqHx9At-9eNdMjjgQImcmCjeuzmEtuA7s3TpCxTH5RUswLEK_M_2VbI0jwG-pg9lsr5x0iOGfWgsrGcXV-SIX4L5pyWwg54540eUJDkrMY7jkCwc760_41cXTMnLnyr5E; _jc_save_toDate=2023-03-16; BIGipServerpassport=854065418.50215.0000; fo=cxx4t2t3ltn80qex2lRGmmfHCDpqRW3Q9Xv-UdmZyGMBQZGc5f1C8mf4BPGpD6zPFFej5udNjgkWJ9OPZODVKzCOWyQ0j1Mmz6XSH66gFjQc8DVGjbLQZySJK6dd97duxlpvBJkSh2P5hOivRT4t0kvgW8YrxBIv-0WL6cDV9RCyiWFlhkAGbAdX7EE; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_fromStation=%u957F%u6C99%2CCSQ; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2023-03-18; BIGipServerotn=1440284938.50210.0000',
#     '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)
# """
# 获取数据, 获取服务器返回响应数据
#     requests.exceptions.JSONDecodeError: Expecting value: line 1 column 4 (char 3)
#     原因 获取的数据不是完整json数据格式
#
# 解析数据, 提取我们想要的内容
#     response.json() --> json字典数据
#     根据键值对取值
#
# ---> 索引是从0开始计数
# lis = ['a', 'b', 'c', 'd']
# <--- 索引是从-1开始计数
# lis[1] --> b  lis[-3]
# lis[0] --> a  lis[-4]
# lis[3] --> d  lis[-1]
#
# """
# tb = pt.PrettyTable()
# tb.field_names = [
#     '序号',
#     '车次',
#     '出发时间',
#     '到达时间',
#     '耗时',
#     '特等座',
#     '一等',
#     '二等',
#     '软卧',
#     '硬卧',
#     '硬座',
#     '无座',
# ]
# page = 1
# for i in response.json()['data']['result']:
#     # 字符串分割, 然后根据索引位置取值
#     index = i.split('|')
#     num = index[3] # 车次
#     time_1 = index[8] # 出发时间
#     time_2 = index[9] # 到达时间
#     use_time = index[10] # 耗时
#     top = index[32] # 特等
#     first = index[31] # 一等
#     second = index[30] # 二等
#     hard_sleeper = index[28]  # 硬卧
#     hard_seat = index[29]  # 硬座
#     no_seat = index[26]  # 无座
#     soft_sleeper = index[23]  # 软卧
#     tb.add_row([page, num, time_1, time_2, use_time, top, first, second, hard_sleeper, hard_seat, no_seat, soft_sleeper])
#     page += 1
#
# print(tb)
# num = input('请输入你想要购买车次序号: ')

尾语 💝

好了,今天的分享就差不多到这里了!

完整代码、更多资源、疑惑解答直接点击下方名片自取即可。

对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇👇

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值