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

yizhihongxing

本攻略将提供一个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技术站

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

相关文章

  • python调用其他文件函数或类的示例

    当我们在编写Python程序时,经常需要调用其他文件中定义的函数或类,这可以大大提高代码的复用性和模块化程度。 以下是Python调用其他文件函数或类的示例攻略: 1. 导入函数 我们可以通过import语句将其他文件中定义的函数导入到当前文件中,然后就可以直接调用该函数。假设我们有一个名为math.py的Python文件,其中定义了一个名为add()的函数…

    python 2023年6月3日
    00
  • python3定位并识别图片验证码实现自动登录功能

    下面是“Python3定位并识别图片验证码实现自动登录功能”的完整攻略。 问题的背景和解决方案 在进行自动化测试或爬虫时,常常会遇到网站使用图片验证码以增强安全性的情况,这会增加自动化测试难度,导致某些重要的测试无法完成。因此,我们需要找到一种方法来自动识别图片验证码并进行登录。 解决方案一般为:使用Python的第三方库PIL(Python Imaging…

    python 2023年5月18日
    00
  • Python中那些 Pythonic的写法详解

    Python中那些Pythonic的写法详解 什么是Pythonic的写法? Pythonic是指遵循Python语言开发规范和惯例的风格和规范。使用Pythonic的编程风格能够让代码更加简洁、易读、易懂、易于维护和重用。Python中的一些特殊语法和惯用法是Pythonic编程风格的重要组成部分。 Python中那些Pythonic的写法? 篇幅简短的i…

    python 2023年5月13日
    00
  • Python实现的百度站长自动URL提交小工具

    下面我将详细讲解如何实现一个简单的Python版百度站长自动URL提交小工具。 1、准备工作 在开始之前,需要确保电脑上已经安装好Python环境,并且安装了requests库。在终端中输入以下命令安装: pip install requests 2、获取百度站长平台的API 百度站长平台提供了API供开发者使用,我们需要先在其官网中注册并获取相应的API密…

    python 2023年5月19日
    00
  • Python中赋值运算符的含义与使用方法

    赋值运算符是Python中最基础的运算符之一,用于将一个值或变量赋值给一个变量名。赋值运算符的使用方法相对简单,但是掌握其含义及注意事项非常重要,本文将从以下几个方面详细讲解赋值运算符的使用。 赋值运算符的含义 Python中的赋值运算符包括=、+=、-=、*=、/=、//=、%=、**=,它们分别对应着不同的操作。其中最基础的是=赋值符号,用于将某个值或变…

    python 2023年6月5日
    00
  • python根据开头和结尾字符串获取中间字符串的方法

    获取中间字符串可以使用Python中字符串的切片、字符串的正则匹配或使用Python中内置的方法split()函数实现。其中,本文将介绍使用split()方法获取中间字符串的方法。 使用split()函数获取中间字符串 split()函数帮助我们将一个字符串按照指定的分隔符分解为多个字符串,并返回这些字符串组成的列表。因此,我们可以从这个列表的中间元素中获取…

    python 2023年6月5日
    00
  • python tkinter canvas 显示图片的示例

    下面是详细的Python Tkinter Canvas显示图片的攻略。 准备工作 在开始编写代码之前,我们需要准备一些工作。 安装Python 首先,我们需要安装Python。 如果你已经安装了Python,可以跳过此步骤。如果还没有安装Python,建议选择Python 3.x版本进行安装。 你可以到官方网站 https://www.python.org/…

    python 2023年5月30日
    00
  • python flask框架快速入门

    为了让读者能够快速上手使用Python Flask框架,我整理了以下的入门攻略,涵盖框架概述、安装、开发基础、应用实例和常用插件介绍。 1. Python Flask框架概述 Python Flask是一个轻量级的Web应用框架,它使用Python语言编写,适用于快速开发Web应用程序。它包含了一个基本的Web服务器和一系列的扩展,可以轻松开发出一个Web应…

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