python爬虫---12306获取列车座位信息

主要核心代码:
Get_CityCode.py

import requests

def get_city():
    target = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9100"
    req = requests.get(url=target)
    station_names = req.text
    station_names_new = station_names.replace("var station_names ='", "").split("@")
    del station_names_new[0]
    station_names_new[-1] = station_names_new[-1].replace("';", "")
    number = len(station_names_new)
    for i in range(0, number, 1):
        station_names_new[i] = station_names_new[i].split("|")
    station = {}
    for j in range(0, number, 1):
        station[station_names_new[j][1]] = station_names_new[j][2]
    return station
    
if __name__ == "__main__":
    print(get_city()['郑州'])

Get_TicketInfo.py

import requests
import Get_URL
import re
import Get_CityCode
from prettytable import PrettyTable

def city_code_name():
    """字典键值互换
        前提:
            键值唯一
        返回互换后的字典
    """
    city_code = Get_CityCode.get_city().copy()
    code_name = dict(zip(city_code.values(), city_code.keys()))
    return code_name
    
def get_ticket_info():
    """
    re.sub(pattern, replace, string, count=0, flags=0)
        pattern : 正则中的模式字符串。replace : 替换的字符串,也可为一个函数。
        string : 要被查找替换的原始字符串。
        count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
        flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
    """
    data = requests.get(url=Get_URL.geturl())
    
    data1 = re.findall("\[.*\]", data.text)
    '''data1是一个列表,格式为['["1","2","3"]']'''
    data2 = data1[0]
    """data2是个字符串,晕死!!!"""
    data3 = data2.replace("[", "").replace("]", "").split(",")
    """split 返回一个元组"""
    number = len(data3)
    # 车次数量
    """
        format:
        *|预订|*|车次|*|*|起始站|终点站|出发时间|到达时间|历时|*|*|*|*|*|*|*|*|*||高级软卧||软卧一等卧|||无座||
         0|    |2|   |4,5 |                                    |11-19|            20|  22 24 25 27 
        硬卧二等座|硬座|二等座|一等座|商务座特等座|动卧|*|*|*|*|*
                    |34 35 36 37 38
    """
    del_list = [0, 2, 4, 5, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 25, 27, 34, 35, 36, 37, 38]
    del_number = len(del_list)
    c = 0
    for x in range(del_number):
        del_list[x] = del_list[x] - c
        c = c + 1
    for i in range(number):
        data3[i] = data3[i].split("|")
        for j in range(del_number):
            del data3[i][del_list[j]]
            # 在迭代的过程中每删除一个元素,接下来将要删除的元素下标要减一,注意!
    """
    format:
     |预订|车次|起始站|终点站|出发时间|到达时间|历时|高级软卧|软卧一等卧|无座|硬卧二等座|硬座|二等座|一等座|商务座特等座|动卧|
    Senior soft sleeper|soft sleeper first bedroom|no seat|hard sleeper second seat|hard seat|second class seat|
    first class seat|business seat special seat|moving bedroom|
    """
    finally_data = data3
    train_numbers = len(finally_data)
    
    start_station_key = []       # 起始站
    to_station_key = []          # 终点站
    start_time = []             # 出发时间
    to_time = []                # 到达时间
    cost_time = []              # 历时
    train_code = []             # 车次
    senior_soft = []              # 高级软卧
    soft_first = []               # 软卧一等卧
    no_seat = []                  # 无座
    hard_second = []              # 硬卧二等座
    hard_seat = []                # 硬座
    second_seat = []              # 二等座
    first_seat = []               # 一等座
    business_seat = []            # 商务座
    moving_sleep = []             # 动卧
    tips = []                       # 提示信息
    for i in range(train_numbers):
        tips.append(finally_data[i][0])
        train_code.append(finally_data[i][1])
        start_station_key.append(city_code_name()[finally_data[i][2]])
        to_station_key.append(city_code_name()[finally_data[i][3]])
        start_time.append(finally_data[i][4])
        to_time.append(finally_data[i][5])
        cost_time.append(finally_data[i][6])
        senior_soft.append(finally_data[i][7])
        soft_first.append(finally_data[i][8])
        no_seat.append(finally_data[i][9])
        hard_second.append(finally_data[i][10])
        hard_seat.append(finally_data[i][11])
        second_seat.append(finally_data[i][12])
        first_seat.append(finally_data[i][13])
        business_seat.append(finally_data[i][14])
        moving_sleep.append(finally_data[i][15])
    """
    输出格式:
    车次      出发站     到达站     出发时间    到达时间    历时      商务座 一等座 二等座 高级软卧    软卧   动卧  硬卧   硬座 无座   备注  
    """
    table = PrettyTable()
    """
    prettytable库:
    快捷创建表格并打印输出;
    安装:pip install prettytable
    导入:from prettytable import PrettyTable
    创建:x = PrettyTable()
    Github 地址:https://github.com/dprince/python-prettytable
    """
    table.add_column("车次", train_code)
    table.add_column("出发站", start_station_key)
    table.add_column("到达站", to_station_key)
    table.add_column("出发时间", start_time)
    table.add_column("到达时间", to_time)
    table.add_column("历时", cost_time)
    table.add_column("商务座", business_seat)
    table.add_column("一等座", first_seat)
    table.add_column("二等座", second_seat)
    table.add_column("高级软卧", senior_soft)
    table.add_column("软卧", soft_first)
    table.add_column("动卧", moving_sleep)
    table.add_column("硬卧", hard_second)
    table.add_column("硬座", hard_seat)
    table.add_column("无座", no_seat)
    table.add_column("备注", tips)
    
    print(table)

写到这里吧,GUI部分就不上传了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值