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

上节分析了获取余票数据的请求,本节开始抓取数据

12306余票查询(二)——获取余票数据_第1张图片
可以看到,这里的站点名,是拼音码,显然是保存在对应的字典中
在网上下载这个字典
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"]         # 提取出余票信息

这里写图片描述
发现返回数据为字典,其实从请求里的query就可以猜到是返回数据库信息了
用json把字符串转化为字典,再从字典里取出余票信息
json.loads(text)
json.loads(text)[“data”]
json.loads(text)[“data”][“result”]
写慢点,就是通过这三步获得余票信息
12306余票查询(二)——获取余票数据_第2张图片
这时,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)

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

你可能感兴趣的:(python,爬虫,12306余票查询)