Python爬虫 12306抢票开源代码过程详解

本攻略将提供一个Python爬虫12306抢票开源代码的详解,包括代码的基本原理、代码的实现过程、代码的使用方法以及两个示例,分别演示如何使用Python爬虫12306抢票。

代码的基本原理

Python爬虫12306抢票的基本原理是通过模拟用户登录12306网站,查询车票信息,提交订单等操作,实现自动抢票的功能。具体实现过程如下:

  1. 使用requests模块模拟用户登录12306网站,获取登录后的Cookie信息。
  2. 使用requests模块查询车票信息,获取车次、座位类型、出发时间等信息。
  3. 使用requests模块提交订单,获取订单号。
  4. 使用requests模块确认订单,获取支付链接。
  5. 使用webbrowser模块打开支付链接,完成支付。

代码的实现过程

以下是Python爬虫12306抢票的实现过程:

  1. 导入所需模块:
import requests
import json
import time
import re
import urllib.parse
import webbrowser
  1. 定义登录函数,获取Cookie信息:
def login():
    session = requests.Session()
    session.get('https://kyfw.12306.cn/otn/login/init')
    login_url = 'https://kyfw.12306.cn/passport/web/login'
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Referer': 'https://kyfw.12306.cn/otn/login/init',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    data = {
        'username': 'your_username',
        'password': 'your_password',
        'appid': 'otn'
    }
    response = session.post(login_url, headers=headers, data=data)
    if response.status_code == 200:
        print('登录成功')
        return session
    else:
        print('登录失败')
        return None
  1. 定义查询车票函数,获取车票信息:
def query_tickets(session, from_station, to_station, date, purpose_codes):
    query_url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    params = {
        'leftTicketDTO.train_date': date,
        'leftTicketDTO.from_station': from_station,
        'leftTicketDTO.to_station': to_station,
        'purpose_codes': purpose_codes
    }
    response = session.get(query_url, headers=headers, params=params)
    if response.status_code == 200:
        result = json.loads(response.text)
        if result['status'] and result['status'] == True:
            tickets = result['data']['result']
            for ticket in tickets:
                ticket_info = ticket.split('|')
                train_no = ticket_info[3]
                from_station_name = ticket_info[6]
                to_station_name = ticket_info[7]
                start_time = ticket_info[8]
                arrive_time = ticket_info[9]
                duration = ticket_info[10]
                swz_num = ticket_info[32] or '--'
                tz_num = ticket_info[25] or '--'
                zy_num = ticket_info[31] or '--'
                ze_num = ticket_info[30] or '--'
                gr_num = ticket_info[21] or '--'
                rw_num = ticket_info[23] or '--'
                yw_num = ticket_info[28] or '--'
                rz_num = ticket_info[24] or '--'
                yz_num = ticket_info[29] or '--'
                wz_num = ticket_info[26] or '--'
                print(train_no, from_station_name, to_station_name, start_time, arrive_time, duration, swz_num, tz_num, zy_num, ze_num, gr_num, rw_num, yw_num, rz_num, yz_num, wz_num)
        else:
            print('查询车票信息失败')
    else:
        print('查询车票信息失败')
  1. 定义提交订单函数,获取订单号:
def submit_order(session, train_no, from_station, to_station, date, purpose_codes, seat_type):
    submit_url = 'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    data = {
        'secretStr': urllib.parse.unquote(secret_str),
        'train_date': date,
        'back_train_date': time.strftime('%Y-%m-%d', time.localtime(time.time())),
        'tour_flag': 'dc',
        'purpose_codes': purpose_codes,
        'query_from_station_name': from_station,
        'query_to_station_name': to_station,
        'undefined': ''
    }
    response = session.post(submit_url, headers=headers, data=data)
    if response.status_code == 200:
        result = json.loads(response.text)
        if result['status'] and result['status'] == True:
            print('提交订单成功')
            return result['data']
        else:
            print('提交订单失败')
            return None
    else:
        print('提交订单失败')
        return None
  1. 定义确认订单函数,获取支付链接:
def confirm_order(session, passenger_name, passenger_id, old_passenger_id, seat_type, train_no, from_station, to_station, date, train_location, repeat_submit_token):
    confirm_url = 'https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }
    data = {
        'passengerTicketStr': '{},0,1,{},N,{},,{},N'.format(seat_type, passenger_name, passenger_id, old_passenger_id),
        'oldPassengerStr': '{},1,{},3_'.format(passenger_name, passenger_id),
        'randCode': '',
        'purpose_codes': '00',
        'key_check_isChange': key_check_is_change,
        'leftTicketStr': urllib.parse.unquote(left_ticket_str),
        'train_location': train_location,
        'choose_seats': '',
        'seatDetailType': '000',
        'whatsSelect': '1',
        'roomType': '00',
        'dwAll': 'N',
        '_json_att': '',
        'REPEAT_SUBMIT_TOKEN': repeat_submit_token
    }
    response = session.post(confirm_url, headers=headers, data=data)
    if response.status_code == 200:
        result = json.loads(response.text)
        if result['status'] and result['status'] == True:
            print('确认订单成功')
            return result['data']['payurl']
        else:
            print('确认订单失败')
            return None
    else:
        print('确认订单失败')
        return None
  1. 定义打开支付链接函数,完成支付:
def pay(pay_url):
    webbrowser.open(pay_url)
  1. 调用函数,实现自动抢票:
if __name__ == '__main__':
    session = login()
    query_tickets(session, 'BJP', 'SHH', '2022-01-01', 'ADULT')
    submit_order(session, 'G101', 'BJP', 'SHH', '2022-01-01', 'ADULT', 'O')
    confirm_order(session, '张三', '123456789012345678', '1_1_1', 'O', 'G101', 'BJP', 'SHH', '2022-01-01', 'N', '1234567890abcdefg')
    pay('https://pay.12306.cn/pay/payGateway.html')

在上面的代码中,首先定义了登录函数、查询车票函数、提交订单函数、确认订单函数和打开支付链接函数。然后在if __name__ == '__main__':中调用这些函数,实现自动抢票的功能。

代码的使用方法

使用Python爬虫12306抢票的方法如下:

  1. 将上面的代码保存为一个Python文件,例如12306.py
  2. 修改代码中的用户名和密码,以及出发站、到达站、出发日期、座位类型等信息。
  3. 在命令行中执行python 12306.py,等待程序自动抢票。

示例

以下是两个示例,分别演示如何使用Python爬虫12306抢票:

示例1:查询车票信息

import requests
import json

query_url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
params = {
    'leftTicketDTO.train_date': '2022-01-01',
    'leftTicketDTO.from_station': 'BJP',
    'leftTicketDTO.to_station': 'SHH',
    'purpose_codes': 'ADULT'
}
response = requests.get(query_url, headers=headers, params=params)
if response.status_code == 200:
    result = json.loads(response.text)
    if result['status'] and result['status'] == True:
        tickets = result['data']['result']
        for ticket in tickets:
            ticket_info = ticket.split('|')
            train_no = ticket_info[3]
            from_station_name = ticket_info[6]
            to_station_name = ticket_info[7]
            start_time = ticket_info[8]
            arrive_time = ticket_info[9]
            duration = ticket_info[10]
            swz_num = ticket_info[32] or '--'
            tz_num = ticket_info[25] or '--'
            zy_num = ticket_info[31] or '--'
            ze_num = ticket_info[30] or '--'
            gr_num = ticket_info[21] or '--'
            rw_num = ticket_info[23] or '--'
            yw_num = ticket_info[28] or '--'
            rz_num = ticket_info[24] or '--'
            yz_num = ticket_info[29] or '--'
            wz_num = ticket_info[26] or '--'
            print(train_no, from_station_name, to_station_name, start_time, arrive_time, duration, swz_num, tz_num, zy_num, ze_num, gr_num, rw_num, yw_num, rz_num, yz_num, wz_num)
    else:
        print('查询车票信息失败')
else:
    print('查询车票信息失败')

在上面的示例中,使用requests模块查询车票信息,获取车次、座位类型、出发时间等信息。

示例2:提交订单

import requests
import json
import urllib.parse

submit_url = 'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
data = {
    'secretStr': urllib.parse.unquote(secret_str),
    'train_date': '2022-01-01',
    'back_train_date': time.strftime('%Y-%m-%d', time.localtime(time.time())),
    'tour_flag': 'dc',
    'purpose_codes': 'ADULT',
    'query_from_station_name': 'BJP',
    'query_to_station_name': 'SHH',
    'undefined': ''
}
response = requests.post(submit_url, headers=headers, data=data)
if response.status_code == 200:
    result = json.loads(response.text)
    if result['status'] and result['status'] == True:
        print('提交订单成功')
        order_id = result['data']
    else:
        print('提交订单失败')
else:
    print('提交订单失败')

在上面的示例中,使用requests模块提交订单,获取订单号。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫 12306抢票开源代码过程详解 - Python技术站

(2)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Python StringIO及BytesIO包使用方法解析

    PythonStringIO及BytesIO包使用方法解析 在Python中,StringIO和BytesIO是两个常用的内存文件操作模块。本文将详细介绍StringIO和BytesIO的用法,并提供两个示例。 StringIO StringIO模块提供了一个类似于文件的对象,可以在内存中读写字符串数据。它可以像文件一样使用read、write等方法。 以下…

    python 2023年5月15日
    00
  • Python爬虫:Request Payload和Form Data的简单区别说明

    Python 爬虫:Request Payload 和 Form Data 的简单区别说明 在使用 Python 进行爬虫时,我们经常需要发送 POST 请求,并传递一些参数。这些参数可以通过 Request Payload 或 Form Data 的方式传递。以下是 Request Payload 和 Form Data 的简单区别说明。 Request …

    python 2023年5月15日
    00
  • python随机数分布random均匀分布实例

    下面是一份“Python随机数分布——均匀分布实例”的完整攻略。在本文中,我将向您展示在Python中使用random模块生成均匀分布随机数的方法,并且提供两个实例以说明此过程。 1. 引言 在Python中,random模块可以用于生成随机数。均匀分布是一种常见的随机分布,在此分布中,每个数据值的概率都相同。在Python中,我们可以使用random模块中…

    python 2023年6月3日
    00
  • python+adb命令实现自动刷视频脚本案例

    Python+ADB命令实现自动刷视频脚本,可以分为以下几个步骤: 环境搭建 要使用Python+ADB命令实现自动刷视频脚本,我们首先需要搭建好相关的环境。具体来说,需要安装好Python以及ADB命令行工具,同时还需要了解如何在电脑上调试安装了ADB驱动的安卓手机。 编辑Python脚本 一旦环境搭建完成,我们就可以开始编写Python脚本来实现自动刷视…

    python 2023年5月19日
    00
  • Python写入MySQL数据库的三种方式详解

    Python是一种广泛应用的语言,常用于数据分析和处理,而MySQL是一种成熟、稳定、高效的关系型数据库,Python与MySQL结合使用,可以实现完整的数据处理流程。在本文中,我们将详细讲解Python写入MySQL数据库的三种方式。 1. 使用Python MySQL Connector库 通过Python MySQL Connector库可以实现Pyt…

    python 2023年6月3日
    00
  • Python drawContours 方法对应用的图像没有任何作用(OpenCV)

    【问题标题】:Python drawContours method does not anything on the image applied (OpenCV)Python drawContours 方法对应用的图像没有任何作用(OpenCV) 【发布时间】:2023-04-04 09:17:01 【问题描述】: 我正在尝试在我的测试图像周围绘制轮廓。我在…

    Python开发 2023年4月6日
    00
  • Python程序员开发中常犯的10个错误

    Python程序员开发中常犯的10个错误 在Python程序开发的过程中,由于疏忽或者不熟悉语言特性等原因,开发者们经常会犯一些错误。这篇文章将会介绍10个在Python程序开发中常见的错误以及如何避免它们。 1. 忘记缩进 在Python语言中,缩进是十分重要的。它决定了代码块中的语句是属于哪个部分的,如果缩进不正确会导致程序出错或者逻辑混乱。在VSCod…

    python 2023年5月13日
    00
  • python使用os.listdir和os.walk获得文件的路径的方法

    当我们需要获取计算机中的文件路径、文件名、文件大小、修改日期等信息时,就需要使用Python中的os模块提供的os.listdir和os.walk函数。这两个函数能够帮助我们获得文件路径的方法,下面我们就来详细讲解使用这两个函数获得文件路径的方法。 os.listdir函数 os.listdir函数可以获得指定文件夹下的所有文件名,即在给定目录中列出所有文件…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部