Python打印车次信息

在网页中寻找需要的网站信息

  1. l_q.query(“出发站”, “到达站”, “时间”):填写购票信息,查询余票(将汉字转化为对应变量)
  2. 了解一下:用户代理(User-Agent),Cookie, requests库
  3. 注意 self.headers = { } 中User-Agent,Cookie格式
"""
查询余票的网址:
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2021-12-23&leftTicketDTO.from_station=SHH&leftTicketDTO.to_station=XUN&purpose_codes=ADULT
伪代码:
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={出发日期(年-月-日)}&leftTicketDTO.from_station={出发地(字母代号)}&leftTicketDTO.to_station={到达地(字母代号)}&purpose_codes=ADULT
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2022-03-25&leftTicketDTO.from_station=WHN&leftTicketDTO.to_station=XUN&purpose_codes=ADULT
method: Get


站点变量:
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217
url : https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217

"""
import urllib3
import requests
from prettytable import PrettyTable
#from selenium.webdriver import Chrome
#import time
#self.query_url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT"


urllib3.disable_warnings()  # 不显示警告信息


class LeftQuery:

    # station_url  查询站名称的url
    def __init__(self):
        self.station_url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217"
                            # https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc&fs=%E6%AD%A6%E6%B1%89,WHN&ts=%E4%BF%A1%E9%98%B3,XUN&date=2022-03-29&flag=N,N,Y
        self.query_url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62",
            "Cookie": "JSESSIONID=15629DB2E7EE37E3054DA145A2F9ECE9; tk=_h0i9eGO__qD2MeAta3XzZBB6nFo5luGdqh1h0; _jc_save_wfdc_flag=dc; _jc_save_zwdch_fromStation=%u676D%u5DDE%2CHZH; _jc_save_zwdch_cxlx=0; guidesStatus=off; _jc_save_toStation=%u4FE1%u9633%2CXUN; route=c5c62a339e7744272a54643b3be5bf64; BIGipServerotn=2196242698.50210.0000; RAIL_EXPIRATION=1648189590792; RAIL_DEVICEID=c1H8Q0iPw8YT_Xc3s-lPXZrNSpInLpaio-078BsqcdOtwa7ZdYAFsV_6wK4xB_nbGQtSdMjyzL95Qx7pcVchE7G8s-4BxpdtUTXRBN0jXpskM7zndoEe1sB37ZhBtpNfWli1SnIEqAP47cYhaMVYNLkLvmdIwpYR; highContrastMode=defaltMode; cursorStatus=off; BIGipServerportal=3168010506.17695.0000; BIGipServerpassport=837288202.50215.0000; _jc_save_fromStation=%u6B66%u6C49%2CWHN; _jc_save_fromDate=2022-03-29; _jc_save_toDate=2022-03-21; current_captcha_type=Z; uKey=16357e0bd021327592f6bb65d2ac514592caecc810a97894efa6b7f761a5f0fb"

        }

    def get_station_name(self, station):
        response = requests.get(url=self.station_url, verify=False).text
        result = response.split("@")[1:]
        temp_dict = {}
        for i in result:
            temp_dict[i.split("|")[1]] = i.split("|")[2]
        #print(temp_dict)
        #print(type(temp_dict))
        return temp_dict[station]

    def query(self, from_station, to_station, date):
        '''
        from_station: 出发第
        to_station:到达地
        date:出发日期
        '''

        fromstation = self.get_station_name(from_station)
        tostation = self.get_station_name(to_station)
        response = requests.get(url=self.query_url.format(date, fromstation, tostation), headers=self.headers,verify=False).json()  #***
        #print(response)
        result = response['data']['result']
        #print(result)
        if result is None:
            print("抱歉,没有符合的列车")
            exit()
        else:
            print(date + from_station + "--" + to_station + "还有机会哦!!!")
            ptable = PrettyTable(
                '车次 出发站/到达站 出发时间/到达时间 历时 商务座 一等座 二等座 高级软卧 软卧一等座 硬卧二等座 动卧 硬座 无座 其他 预定'.split())
            print(ptable)
            tickets=[]
            for ticket in result:
                ticket_list = ticket.split("|")
                yuding = ticket_list[1]
                # 车次在索引为3的位置,以下类似
                checi = ticket_list[3]
                shifa_codes = ticket_list[4]
                zhongdian_codes = ticket_list[5]
                from_code = ticket_list[6]
                to_code = ticket_list[7]
                chufa_time = ticket_list[8]
                daoda_time = ticket_list[9]
                total_time = ticket_list[10]
                vip = ticket_list[32]
                yideng = ticket_list[31]
                erdeng = ticket_list[30]
                gaoji_ruanwo = ticket_list[21]
                yideng_ruanwo = ticket_list[23]
                erdeng_ruanwo = ticket_list[28]
                dongwo = ticket_list[33]
                yingzuo = ticket_list[29]
                wuzuo = ticket_list[26]
                qita = "--"
                tickets.append(
                    [checi, from_station, to_station, chufa_time, daoda_time, total_time, vip, yideng, erdeng,
                     gaoji_ruanwo, yideng_ruanwo, erdeng_ruanwo, dongwo, yingzuo, wuzuo, qita, yuding])

                for i in tickets:
                    for y in range(len(i)):
                        if i[y] == '':
                            i[y] = '--'

                print(i)







if __name__ == '__main__':
     l_q = LeftQuery()
     l_q.query("杭州", "信阳", "2022-03-29")




效果图
  • 我的效果图,额…反正能看,上方有链接,去向橘子女侠学习吧
    在这里插入图片描述

橘子女侠(效果图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值