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数据预处理方式 :数据降维

    Python数据预处理技术对于机器学习项目的成功至关重要,数据降维是其中一个极其重要的技术。在本文中,我们将讨论Python数据预处理的数据降维技术,为你展示如何降低数据维度的方法,以及如何实现这些方法。 数据降维方法 主成分分析(PCA) 主成分分析(PCA)是一种基本的数据降维技巧。PCA使用线性变换将高维度数据向低维度数据压缩。 实现该方法使用了Pyt…

    python 2023年6月3日
    00
  • Python自动化办公之创建PPT文件

    一、创建PPT文件的工具 Python中的PPTX模块可以帮助我们创建和修改PPT文件。该模块已经成为Python中的常用工具之一。安装方法如下: pip install python-pptx 二、创建PPT文件流程 1.导入PPTX模块 from pptx import Presentation 2.创建PPT对象 prs = Presentation(…

    python 2023年6月5日
    00
  • Python实现进程同步和通信的方法

    实现进程同步和通信的方法在Python中有很多种,下面将分别详细讲解。 进程同步 多个进程同时执行某个任务时,为了避免资源冲突和错误的发生,我们需要对它们进行同步。在Python中常用的进程同步方法有锁和队列。 锁 锁是一种最基本的同步机制,它可以帮助我们保证多个进程或线程在同一时刻只有一个可以访问共享资源。Python提供了一个Lock对象来实现锁。 fr…

    python 2023年5月19日
    00
  • python读取浮点数和读取文本文件示例

    Python是一种强大的编程语言,具有众多的功能和库。在其中读取浮点数和读取文本文件是常见的操作之一。 读取浮点数 读取单个浮点数 使用Python内置的input()函数可以读取用户输入的字符串,但是默认情况下读取到的都是字符串类型。如果需要读取浮点数,需要进行类型转换。 例如,下面的代码演示了如何通过input()读取一个浮点数并进行计算: num = …

    python 2023年6月5日
    00
  • python实现随机密码字典生成器示例

    接下来我将详细讲解如何使用Python编写随机密码字典生成器。 1. 随机密码生成器 我们可以使用Python自带的secrets库来生成随机的密码字典。具体的操作步骤如下: 导入secrets库 import secrets 设置生成密码字典的长度和字符集;一般常用的字符集有数字、小写字母、大写字母和特殊字符等。 alphabet = "0123…

    python 2023年5月13日
    00
  • 详解基于K-means的用户画像聚类模型

    详解基于K-means的用户画像聚类模型 简介 K-means是一种经典的聚类算法,可以在无监督的情况下对数据进行分组。本文将详细介绍如何使用K-means算法来构建用户画像聚类模型。 步骤 1.数据收集 首先需要获得用户的相关数据,例如用户的基本信息,用户的行为数据等。这些数据可以从不同的数据源收集,比如数据库、社交网络、推荐系统等。需要注意的是,数据要求…

    python 2023年6月3日
    00
  • 再也不用花钱买漫画!Python爬取某漫画的脚本及源码

    下面是完整攻略: 1. 确定目标网站及爬取对象 首先需要确定要爬取的目标网站以及具体的爬取对象。本篇攻略我们以“动漫之家漫画网”为例,爬取其中的某个漫画。在确定目标漫画后,需要找到该漫画的章节目录页以及对应漫画图片所在的页面。 2. 安装必要的库和工具 爬取网页需要使用的库和工具有很多,具体可以根据实际需求进行选择。在本次攻略中,我们需要使用以下库: req…

    python 2023年6月2日
    00
  • 导入tensorflow时报错:cannot import name ‘abs’的解决

    当在导入Tensorflow时遇到“cannotimportname’abs’”错误时,通常是因为在导入Tensorflow时,发现了不兼容版本的Numpy库,导致错误发生。要解决这个问题,我们可以采取以下步骤: 确认Numpy库的版本是否兼容。Tensorflow文档中指定了与其结合使用的Numpy版本,我们可以访问Tensorflow官网,查找文档并确认…

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