首页 > 编程语言 >python爬虫——爬取12306火车票信息

python爬虫——爬取12306火车票信息

时间:2024-07-08 15:00:19浏览次数:14  
标签:info kind python list seat 爬取 12306 pd time




前提准备:requests、pandas、threading等第三方库的导入(未下载的先进行下载)
导入库代码

from threading import Thread #多线程库
import requests
import pandas as pd  
import json   #json库



完整步骤

1.在网页找到需要的数据

(1)任意输入出发地——目的地——日期,点击查询(我这里查询的是:2024年7月6日长沙到武汉的票)

(2)打开抓包工具,重新刷新页面

(3)在抓包工具里面找到内容所在页面
在这里插入图片描述

通过比对发现车票数据在这个json页面内容里面,但是内容有点复杂,需要我们自己去提取,经过选择,结果如下:

    result = front_content.json()['data']['result']    #返回json字典数据
    for it in result:
        info_list = it.split("|")  #切割数据,中文转英文
        num = info_list[3]
        start = info_list[8]        #启动时间
        arrive = info_list[9]       #到达时间
        time = info_list[10]        #经历时长
        business_seat = info_list[32]   #高铁商务座
        first_seat = info_list[31]      #高铁一等座
        second_seat = info_list[30]     #高铁二等座
        soft_sleeper = info_list[23]       #火车软卧
        hard_sleeper = info_list[28]       #火车硬卧
        soft_seat = info_list[27]         #火车软座
        hard_seat = info_list[29]        #火车硬座
        none_seat = info_list[26]         #无座







2.爬取网页数据(带负载)

①url前半部分
在这里插入图片描述
②url后半部分负载
在这里插入图片描述


两者结合得到需要的url(带负载,请求头)

    front_url = "https://kyfw.12306.cn/otn/leftTicket/query"
    data = {
       "leftTicketDTO.train_date": time,
       "leftTicketDTO.from_station": start,
       "leftTicketDTO.to_station": end,
       "purpose_codes": "ADULT"
    }
    header = {
        "User Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/"
                     "537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
        "Cookie": ("_uab_collina=171612732780866759993918; JSESSIONID=1753D82C75A9D1B5FD26D74F047D5B2F; _jc_save_wfdc_flag=dc; BIGipServerotn=1373176074.50210.0000; BIGipServerpassport=837288202.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; route=c5c62a339e7744272a54643b3be5bf64; BIGipServerportal=3084124426.17183.0000; _jc_save_fromStation=%u957F%u6C99%2CCSQ; "
                   "_jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2024-06-28; _jc_save_toDate=2024-06-28")
    }

    front_content = requests.get(front_url, params=data, headers=header)  #发起requests请求


(注:长沙:CSQ 武汉:WHN,这些城市对应的代码放在文末的json文件里面,需要自取)




3.额外设计


(1)对出发地——目的地——时间,这三个输入增加了一个函数进行判断输入格式或内容是否正确,并返回三个元素组成的列表
#判断函数并且返回出发地——目的地——时间(列表)
def chaxun(city):

    #判断出发地
    while True:
        in_start = input("请输入出发地:\n")
        if in_start not in city.keys():
            print("输入的城市有误,请重新输入:")
            continue
        else:
            break
    #判断目的地
    while True:
        in_end = input("请输入目的地:\n")
        if in_end not in city.keys():
            print("输入的城市有误,请重新输入:")
            continue
        else:
            break
    # 判断输入时间格式
    while True:
        time = input("请输入时间(格式:xxxx.xx.xx):\n")
        if (len(time.split(".")) != 3 or len(time.split(".")[0]) != 4
                or len(time.split(".")[1]) != 2 or len(time.split(".")[2]) != 2):
            print("输入的时间有误,请重新输入:")
            continue
        else:
            break
    time = time.replace('.', '-')
    in_start = city[in_start]
    in_end = city[in_end]
    chaxun_list = [in_start, in_end, time]
    return chaxun_list




(2)对需要查询的动车类型单独增加一个函数,返回动车类型

def the_kind():
    #输入动车类型
    kind_list = ['高铁', '火车', '全部']
    while True:
        kind = input("请输入要查询的类型(高铁/火车/全部):\n")
        if kind in kind_list:
            break
        else:
            continue
    return kind




(3)将结果写入excel文件,结果更加整齐清晰

 #三种类型票 高铁 火车 全部
    content_G = pd.DataFrame(lst_G)
    content_KTZ = pd.DataFrame(lst_KTZ)
    content_all = pd.DataFrame(lst_all)

    if kind == '高铁':
        with pd.ExcelWriter("火车票查询.xlsx",mode="w") as w:
            content_G.to_excel(w, sheet_name="高铁票", index=False)
    elif kind == '火车':
        with pd.ExcelWriter("火车票查询.xlsx", mode="w") as w:
            content_KTZ.to_excel(w, sheet_name="火车票", index=False)
    else:
        with pd.ExcelWriter("火车票查询.xlsx", mode="w") as w:
            content_all.to_excel(w, sheet_name="全部票", index=False)





4.完整代码

from threading import Thread
import requests
import pandas as pd
import json

#导入城市
f2 = open('city.json', 'r')
city = json.load(f2)


#查询函数
def chaxun(city):

    #判断出发地
    while True:
        in_start = input("请输入出发地:\n")
        if in_start not in city.keys():
            print("输入的城市有误,请重新输入:")
            continue
        else:
            break
    #判断目的地
    while True:
        in_end = input("请输入目的地:\n")
        if in_end not in city.keys():
            print("输入的城市有误,请重新输入:")
            continue
        else:
            break
    # 判断输入时间格式
    while True:
        time = input("请输入时间(格式:xxxx.xx.xx):\n")
        if (len(time.split(".")) != 3 or len(time.split(".")[0]) != 4
                or len(time.split(".")[1]) != 2 or len(time.split(".")[2]) != 2):
            print("输入的时间有误,请重新输入:")
            continue
        else:
            break
    time = time.replace('.', '-')
    in_start = city[in_start]
    in_end = city[in_end]
    chaxun_list = [in_start, in_end, time]
    return chaxun_list

#动车类型函数
def the_kind():
    #输入动车类型
    kind_list = ['高铁', '火车', '全部']
    while True:
        kind = input("请输入要查询的类型(高铁/火车/全部):\n")
        if kind in kind_list:
            break
        else:
            continue
    return kind

#爬取并输出函数
def func(time, start, end, kind):

    front_url = "https://kyfw.12306.cn/otn/leftTicket/query"
    data = {
       "leftTicketDTO.train_date": time,
       "leftTicketDTO.from_station": start,
       "leftTicketDTO.to_station": end,
       "purpose_codes": "ADULT"
    }
    header = {
        "User Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/"
                     "537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
        "Cookie": ("_uab_collina=171612732780866759993918; JSESSIONID=1753D82C75A9D1B5FD26D74F047D5B2F; _jc_save_wfdc_flag=dc; BIGipServerotn=1373176074.50210.0000; BIGipServerpassport=837288202.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; route=c5c62a339e7744272a54643b3be5bf64; BIGipServerportal=3084124426.17183.0000; _jc_save_fromStation=%u957F%u6C99%2CCSQ; "
                   "_jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2024-06-28; _jc_save_toDate=2024-06-28")
    }

    front_content = requests.get(front_url, params=data, headers=header)
    front_content.encoding = "utf-8"
    front_content.close()    #关闭requests
    result = front_content.json()['data']['result']    #返回json字典数据

    lst_G = [] #高铁信息
    lst_KTZ = [] #火车信息
    lst_all = [] #全部信息

    for it in result:
        info_list = it.split("|")  #切割数据,中文转英文
        num = info_list[3]
        start = info_list[8]        #启动时间
        arrive = info_list[9]       #到达时间
        time = info_list[10]        #经历时长
        business_seat = info_list[32]   #高铁商务座
        first_seat = info_list[31]      #高铁一等座
        second_seat = info_list[30]     #高铁二等座
        soft_sleeper = info_list[23]       #火车软卧
        hard_sleeper = info_list[28]       #火车硬卧
        soft_seat = info_list[27]         #火车软座
        hard_seat = info_list[29]        #火车硬座
        none_seat = info_list[26]         #无座
        dic = {
               "车次": num,
               "启动时间": start,   # 启动时间
               "到达时间": arrive,      #到达时间
               "中途时长": time,        #经历时长
               "商务座": business_seat,  #高铁商务座
               "一等座": first_seat,      #高铁一等座
               "二等座": second_seat,    #高铁二等座
               "软卧": soft_sleeper,       #火车软卧
               "硬卧": hard_sleeper,       #火车硬卧
               "软座": soft_seat,         #火车软座
               "硬座": hard_seat,        #火车硬座
               "无座": none_seat         #无座
        }

    #进行三种分类
        lst_all.append(dic)
        if 'G' in num:
            lst_G.append(dic)
        else:
            lst_KTZ.append(dic)

    #dataframe格式设置
    pd.set_option('display.unicode.ambiguous_as_wide', True)
    pd.set_option('display.unicode.east_asian_width', True)
    pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
    pd.set_option('display.width', 100)

    #三种类型票 高铁 火车 全部
    content_G = pd.DataFrame(lst_G)
    content_KTZ = pd.DataFrame(lst_KTZ)
    content_all = pd.DataFrame(lst_all)

    if kind == '高铁':
        with pd.ExcelWriter("火车票查询.xlsx",mode="w") as w:
            content_G.to_excel(w, sheet_name="高铁票", index=False)
    elif kind == '火车':
        with pd.ExcelWriter("火车票查询.xlsx", mode="w") as w:
            content_KTZ.to_excel(w, sheet_name="火车票", index=False)
    else:
        with pd.ExcelWriter("火车票查询.xlsx", mode="w") as w:
            content_all.to_excel(w, sheet_name="全部票", index=False)

if __name__ ==  '__main__':
    lis = chaxun(city)
    in_start = lis[0]
    in_end = lis[1]
    time = lis[2]
    kind = the_kind()
    func(time, in_start, in_end, kind)
    





5.结果

在这里插入图片描述
在这里插入图片描述


额外:城市代码的city.json文件在本人主页的资源里面,可以直接免费下载保存

标签:info,kind,python,list,seat,爬取,12306,pd,time
From: https://blog.csdn.net/qq_65384447/article/details/140234213

相关文章

  • python:使用matplotlib库绘制图像(一)
    作者是跟着http://t.csdnimg.cn/4fVW0学习的,matplotlib系列文章是http://t.csdnimg.cn/4fVW0的自己学习过程中整理的详细说明版本,对小白更友好哦!一、Matplotlib图像基础1.1 基本绘图实例:sin、cos函数图代码详解:1.frompylabimport*:导入pylab库中所有函数和变量。pyla......
  • 人脸识别与美颜算法实战:基于Python、机器学习与深度学习
    代码和pdf书等:GitHub-guozhe1992/read引言与基础知识:介绍人脸识别与美颜算法的基本概念、应用场景以及Python编程和机器学习的基础知识。视频图像处理技术:详细讲解基于Anaconda和PyCharm的环境搭建,以及视频图像处理的基础技术,如图像读取、显示、保存和格式转换等。抖音特效......
  • python模型文件转换,将.pth转换为.onnx
    为了方便在C#项目中引用onnx文件,于是需要将pth模型文件转换为onnx类型。转换的模型项目地址是:https://github.com/xuebinqin/U-2-Net,以下为python的示例代码:1importtorch2importsys3importos4model_dir=os.path.join(os.path.dirname(__file__),'model')5sys......
  • Python之文件处理
    python进行文件处理其实也很简单,无法就那么几个要点。1、打开文件2、读取文件3、写入文件围绕上面这三个要点展开了许多的方法,调用方法进行各种花样的文件处理。听起来仿佛很牛逼,实际上没有多少花头,深刻理解了也就自然而然的掌握了。例如先自己创建一个文件,假设在D:\python-......
  • 井字棋 AI-Python
    1.介绍程序中的算法:MinMax算法,也称为极小化极大算法,是一种在博弈论中广泛应用的算法,用于在两个竞争者之间进行零和博弈时,找出最优策略。该算法适用于井字棋、象棋等游戏,旨在为玩家提供最佳决策。其基本思想是假设对手不会犯错误,从而在最坏情况下保证自己的最大利益。Minim......
  • 使用Python之前的准备
    鉴于配置Ottertune项目花了整整两天还没配好,其中一个很重要的原因是使用古老的Python包及其错综复杂的依赖关系,而我平时使用C++开发较多,较少使用Python。为了避免下次配置环境时重蹈覆辙,我决定将本次配置环境的经验教训记录下来。启用虚拟环境目的:便于实验不同的Python版本虚......
  • 在Windows环境下安装Python 3.11的步骤
    在Windows环境下安装Python3.11的步骤相对直接。下面是详细的安装教程:第一步:下载Python3.11安装程序访问Python官方网站的下载页面:https://www.python.org/downloads/在页面中找到适用于Windows的Python3.11版本,点击下载对应你操作系统的安装包。通常,你会看到一个明显......
  • Python中的面向对象编程:从入门到实践
    Python中的面向对象编程:从入门到实践一、引言面向对象编程(Object-OrientedProgramming,OOP)是Python语言中一个核心概念,它提供了一种处理程序复杂性的方法。通过OOP,我们可以使用对象和类的概念来模拟现实世界的实体和行为。本文将深入探讨Python中的面向对象编程,包括类与对......
  • Python酷库之旅-第三方库Pandas(010)
    目录一、用法精讲22、pandas.read_hdf函数22-1、语法22-2、参数22-3、功能22-4、返回值22-5、说明22-6、用法22-6-1、数据准备22-6-2、代码示例22-6-3、结果输出23、pandas.HDFStore.put方法23-1、语法23-2、参数23-3、功能23-4、返回值23-5、说明23-6、用法......
  • doc转docx(java-python)
    本文功能借助python实现的doc转docx,调研了一下开源的工具或者类库转换效果不理想,所以选择python 1./resources/convert.py(py文件放到resources下)importargparsefromdoc2docximportconvertdefconvert_doc_to_docx(docFilePath,docxFilePath):convert(docFi......