12306抢票程序!赶快抢了车票迎接八天假期吧,嗨皮~

前言:

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

环境使用:

  • Python 3.8

  • Pycharm

模块使用:

  • requests

  • prettytable

  • selenium --> pip install selenium==3.141.0 版本

  • 谷歌浏览器 <不一定是谷歌, 但是驱动文件和浏览器对应>

  • 谷歌驱动

素材: 点击此处转文末获取

  • city.json 城市文件

  • 驱动安装教程

案例分为两部分:

  1. 查票 --> 相当于把车次信息获取下来

  2. 购票

查票实现: <爬虫相关技术知识点>
  1. 抓包分析 --> 车次信息在那个数据包里面

    • 打开开发者工具: F12

    • 点击查询:

      https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2023-09-22&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=SHH&purpose_codes=ADULT

  2. 通过爬虫代码步骤实现车次信息数据获取:

    • 发送请求 -> 模拟浏览器对于url地址发送请求

    • 获取数据 -> 获取服务器返回响应数据

    • 解析数据 -> 提取车次信息内容

购票程序: selenium自动化测试模块

模拟人的行为操作浏览器 selenium -> 浏览器驱动 -> 浏览器

买票流程:

  1. 打开浏览器, 访问网站

  2. 输入出发地 / 目的地 / 时间 查询

  3. 点击预定按钮

  4. 输入帐号密码登陆

  5. 选择乘车人, 选择座位 <可选可不选>

  6. 提交订单 / 确定购买

代码展示

导入模块

# 导入数据请求模块
import requests
# 导入制表
import prettytable as pt
# 导入序列化
import json
# 导入自动化测试模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 导入时间模块
import time
# 导入账号密码
from password import account, Password
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def Train(num, date, from_city, to_city):
    # 打开浏览器
    driver = webdriver.Chrome()
    # 访问网站
    driver.get('https://kyfw.12306.cn/otn/leftTicket/init')
    # 设置等待
    driver.implicitly_wait(10)

“”"

元素定位, 找到对应标签位置, 进行相关的操作…

  • driver.find_element_by_id() 通过标签ID

  • driver.find_element_by_class_name() 通过标签class类名

  • driver.find_element_by_css_selector() 通过css语法

  • driver.find_element_by_xpath() 通过xpath

“”"

输入出发城市

    driver.find_element_by_id('fromStationText').click()
    driver.find_element_by_id('fromStationText').clear()
    driver.find_element_by_id('fromStationText').send_keys(from_city)
    driver.find_element_by_id('fromStationText').send_keys(Keys.ENTER)

输入目的城市

    driver.find_element_by_id('toStationText').click()
    driver.find_element_by_id('toStationText').clear()
    driver.find_element_by_id('toStationText').send_keys(to_city)
    driver.find_element_by_id('toStationText').send_keys(Keys.ENTER)

输入出发时间

    driver.find_element_by_id('train_date').click()
    driver.find_element_by_id('train_date').clear()
    driver.find_element_by_id('train_date').send_keys(date)
    driver.find_element_by_id('train_date').send_keys(Keys.ENTER)

点击查询

    driver.find_element_by_id('query_ticket').click()

点击预定车票 第一个车次进行预定 1 3 5 7 9 11 2*num -1

    driver.find_element_by_css_selector(f'#queryLeftTable tr:nth-child({2*int(num) -1}) .btn72').click()

输入账号

    driver.find_element_by_id('J-userName').send_keys(account)

输入密码

    driver.find_element_by_id('J-password').send_keys(Password)

点击登陆

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
    driver.find_element_by_id('J-login').click()
    time.sleep(2)
    driver.find_element_by_id('id_card').send_keys('203X')
    driver.find_element_by_id('verification_code').click()
    yzm = input('请输入你验证码: ')
    driver.find_element_by_id('code').send_keys(yzm)
    driver.find_element_by_id('sureClick').click()
    driver.implicitly_wait(10)
    driver.find_element_by_id('normalPassenger_1').click()
    driver.find_element_by_id('submitOrder_id').click()
    time.sleep(3)
    driver.find_element_by_id('qr_submit_id').click()

读取文件

with open('city.json', encoding='utf-8') as f:
    # 读取内容返回字符串
    text = f.read()
# 转成字典数据
city_info = json.loads(text)
print(city_info)
from_city = input('请输入你要出发的城市: ')
to_city = input('请输入你要到达的城市: ')
date = '2023-09-22'
print(city_info[from_city])
print(city_info[to_city])
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 模拟浏览器 -> 可以直接复制 <字典数据>
headers = {
    'Cookie': '_uab_collina=169468986750041591890733; JSESSIONID=3CADFAFE87DA989911A04860B83F105B; BIGipServerpassport=820510986.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; BIGipServerotn=4124508426.24610.0000; fo=61khfkvbseezqnv52-DolTOwMsIkA0NSXo-s7vt_2-z4cOjkQ5CEwiuz9Wa1M87JPD31uI75bKEUzzfvAjJKX2RUJWAmFgta665Wjtm_8SeINCHfJBuKaPyL3Xwp2XG-ungvz5DqzuaXdxjs7oALaBFUU-BqbKTv7Z2-FqVyPvynYGeaC7FyPr64BSM; route=9036359bb8a8a461c164a04f8f50b252; _jc_save_fromStation=%u957F%u6C99%2CCSQ; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2023-09-22; _jc_save_toDate=2023-09-14; _jc_save_wfdc_flag=dc',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
# 请求链接
url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ'
# 请求参数 <字典数据>
data = {
    'leftTicketDTO.train_date': '2023-09-22',
    'leftTicketDTO.from_station': city_info[from_city],
    'leftTicketDTO.to_station': city_info[to_city],
    'purpose_codes': 'ADULT'
}
# 发送请求
response = requests.get(url=url, params=data, headers=headers)
# 获取响应的json数据
json_data = response.json()
tb = pt.PrettyTable()
tb.field_names = [
    '序号',
    '车次',
    '出发时间',
    '到达时间',
    '耗时',
    '特等座',
    '一等',
    '二等',
    '软卧',
    '硬卧',
    '硬座',
    '无座',
]
page = 1
# for循环遍历
for i in json_data['data']['result']:
    # 字符串分割
    index = i.split('|')
    # 根据列表索引位置取值
    num = index[3]  # 车次
    start_time = index[8]  # 出发时间
    end_time = index[9]  # 到达时间
    use_time = index[10]  # 耗时
    topGrade = index[32]  # 特等座
    if topGrade:
        topGrade = topGrade
    else:
        topGrade = index[25]
    first_class = index[31]  # 一等
    second_class = index[30]  # 二等
    hard_sleeper = index[28]  # 硬卧
    hard_seat = index[29]  # 硬座
    no_seat = index[26]  # 无座
    soft_sleeper = index[23]  # 软卧
    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
print(tb)
num = input('请输入你要购买车次序号: ')
Train(num, date, from_city, to_city)

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦

希望本篇文章有对你带来帮助 ,有学习到一点知识~

躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。

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

你可能感兴趣的:(python爬虫,python,开发语言,pycharm,爬虫)