欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

12306余票查询(二)——获取余票数据

程序员文章站 2024-03-17 22:25:58
...
上节分析了获取余票数据的请求,本节开始抓取数据

12306余票查询(二)——获取余票数据
可以看到,这里的站点名,是拼音码,显然是保存在对应的字典中
在网上下载这个字典
https://pan.baidu.com/s/1i4FTjgD
我是在这里下载的,整理好的py文件,可以直接使用.
现在终于可以开始爬取数据了

class Get_tickets:
    def __init__(self,start_station,destination,date):
        self.date = date
        self.params = {
                        "leftTicketDTO.train_date": date,
                        "leftTicketDTO.from_station": stationsInfo.stations2CODE[start_station],
                        "leftTicketDTO.to_station": stationsInfo.stations2CODE[destination],
                        "purpose_codes": "ADULT"
                        }

首先是传递你到底要查什么,就是前面分析所需的三个参数
其实这里要判断一下,输入的站点在不在站点字典里,但是,为了节省篇幅,先把整体流程走出来,那些细枝末节留到后面说.
把三个参数直接保存进params字典中,为什么date要单独保存为实例变量,这个后面会说

base_url = "https://kyfw.12306.cn/otn/leftTicket/query?"
def get_data(self):
    # 请求数据获取余票信息
    url = base_url + urlencode(self.params)             # 拼接请求链接
    text = requests.get(url).text                        # 发送请求,以string方式返回
    result = json.loads(text)["data"]["result"]         # 提取出余票信息

12306余票查询(二)——获取余票数据
发现返回数据为字典,其实从请求里的query就可以猜到是返回数据库信息了
用json把字符串转化为字典,再从字典里取出余票信息
json.loads(text)
json.loads(text)[“data”]
json.loads(text)[“data”][“result”]
写慢点,就是通过这三步获得余票信息
12306余票查询(二)——获取余票数据
这时,result是指向一个列表,列表保存每条列车的余票数据
单独拿出每条数据来看,会发现数据由”|”分割,这时,我们强大的split方法可以直接把这一大串的字符串切分出来,返回列表类型数据

self.tickets_info = []
# 提取余票信息
for r in result:
    # 分割数据
    r_list = r.split("|")
    # 过滤数据
    r_dict = {
        'train_code': r_list[3],
        'train_no': r_list[2],
        'start_time': r_list[8],
        'end-time': r_list[9],
        'arrive_time': r_list[10],
        'from_station': r_list[6],
        'to_station': r_list[7],
        'date': r_list[13],
        'business_seat': r_list[-5],
        'first_seat': r_list[-6],
        'second-seat': r_list[-7],
        'gjrw': r_list[-8],
        'rw': r_list[-9],
        'dw': r_list[-10],
        'yw': r_list[-11],
        'rz': r_list[-12],
        'yz': r_list[-13],
        'wz': r_list[-14],
        'qt': r_list[-15],
        'remark': r_list[1],
        'seat_type': r_list[-2],
        "from_station_no": r_list[16],
        "destinction_no": r_list[17],
    }
    # 数据重整 如过对应数据为"",因为显示出来得为"--",所以在这把字典所有的""="--"
    for key in r_dict:
        if r_dict[key] == "":
            r_dict[key] = '--'
    # 填入数据 把没一条整理好的列车余票字典,保存到实例属性tickets_info列表中
     self.tickets_info.append(r_dict)

这里对解析数据对应位置没有做过多的赘述,因为这种解析数据,有耐心就好,做爬虫肯定都得自己解析的
先写到这里,下一节把获取票价贴出来,

import requests, json, threading, stationsInfo
from urllib.parse import urlencode
from get_ticket_price import get_price
base_url = "https://kyfw.12306.cn/otn/leftTicket/query?"
class Get_tickets:
    def __init__(self,start_station,destination,date):
        self.date = date
        self.params = {
                        "leftTicketDTO.train_date": date,
                        "leftTicketDTO.from_station": stationsInfo.stations2CODE[start_station],
                        "leftTicketDTO.to_station": stationsInfo.stations2CODE[destination],
                        "purpose_codes": "ADULT"
                        }
        self.get_data()

    def get_data(self):
        # 请求数据获取余票信息
        url = base_url + urlencode(self.params)             # 拼接请求链接
        text = requests.get(url).text                        # 发送请求,以string方式返回
        result = json.loads(text)["data"]["result"]         # 提取出余票信息

        self.tickets_info = []
        # 提取余票信息
        for r in result:
            # 分割数据
            r_list = r.split("|")
            # 过滤数据
            r_dict = {
                'train_code': r_list[3],
                'train_no': r_list[2],
                'start_time': r_list[8],
                'end-time': r_list[9],
                'arrive_time': r_list[10],
                'from_station': r_list[6],
                'to_station': r_list[7],
                'date': r_list[13],
                'business_seat': r_list[-5],
                'first_seat': r_list[-6],
                'second-seat': r_list[-7],
                'gjrw': r_list[-8],
                'rw': r_list[-9],
                'dw': r_list[-10],
                'yw': r_list[-11],
                'rz': r_list[-12],
                'yz': r_list[-13],
                'wz': r_list[-14],
                'qt': r_list[-15],
                'remark': r_list[1],
                'seat_type': r_list[-2],
                "from_station_no": r_list[16],
                "destinction_no": r_list[17],
            }

            # 数据重整
            for key in r_dict:
                if r_dict[key] == "":
                    r_dict[key] = '--'
            # 填入数据
            self.tickets_info.append(r_dict)

这些就是这篇文章,涉及的代码

相关标签: 12306余票查询