自学内容网 自学内容网

利用Python爬取12306网站车次信息

前言

随着互联网技术的发展,网络爬虫成为了获取公开数据的强大工具之一。对于经常需要查询火车票信息的人来说,能够自己编写一个爬虫程序来自动获取并整理这些信息,无疑是一个非常实用的技能。本文将详细介绍如何使用Python爬取12306网站上的车次信息,包括获取站点对应城市信息、查询列车编号以及获取具体的班次信息。

整体思路

先循环查询所有站点与站点之间的车次信息,根据对应的车次信息获取对应车次编码,然后再根据车次编码查询详细的班次信息。

1、准备工作

在开始之前,请确保你的环境中已安装了以下库:

  1. requests:一个非常流行的HTTP客户端库,可以方便地发送HTTP请求。
  2. re:用于正则表达式匹配,帮助我们解析HTML内容。

如果未安装这些库,可以通过以下命令安装:

pip install requests

2、获取站点对应城市信息

首先,我们需要获取所有火车站的名称及其对应的代码,这一步是必要的,因为后续查询车次信息时需要用到这些代码。相关信息可以从以下URL获取。这段JavaScript文件包含了所有车站的名字和它们对应的编码。我们可以通过正则表达式来解析这个文件,提取出我们需要的信息。

https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9053 这个网站解析目前国内所有车站代码以及对应的城市名称

3、查询列车编号

接下来,我们将使用上一步获取到的车站代码来查询指定日期和线路的列车编号。这里以北京(BJP)到上海(SHH)为例,查询2024年11月21日的列车信息。

def get_respose(url):
    try:
        r = requests.get(url)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r
    except:
        return None


def get_station_name_list():
    r = get_respose(NAME_URL)
    info = r.text
    match = re.search(r'\'(.*?)\'', info)
    station_lists = match.group(1)[1:]
    namelist = station_lists.split('@')
    city_list = set()
    for i in range(len(namelist)):
        station_info = namelist[i].split('|')
        station_sx1 = str(station_info[0])
        station_name = str(station_info[1])
        station_code = str(station_info[2])
        station_py = str(station_info[3])
        station_sx2 = str(station_info[4])
        station_city_code = str(station_info[6])
        station_city_name = str(station_info[7])
        res = (station_sx1 + '\u0001' + station_name + '\u0001' + station_code + '\u0001' + station_py + '\u0001' +
               station_sx2 + '\u0001' + station_city_code + '\u0001' + station_city_name + '\n')
        if station_city_name == '上海':
            city_list.add(station_code)
        else:
            pass
    print(city_list)
    city_lists = list(city_list)
    permutations = list(itertools.permutations(city_lists, 2))
    # print(permutations)
    return permutations

上述这段代码可以按照自己的需要进行调整,获取指定城市的所有站点代码,然后再进行两两站点排列组合,进而获取站点与站点之间所有可能出现的组合。

4、获取班次信息

通过研究观察发现对应站点之间的数据都存储在铁路客户服务中心

https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=240000G1050R&from_station_telecode=VNP&to_station_telecode=AOH&depart_date=2024-11-26

 再次构造函数对这个URL进行解析,以获取对应车次的列出编码

def spider_station(permutations):
    infos = list()
    current_date = datetime.now()
    previous_date = current_date - timedelta(days=-1)
    base_date = previous_date.strftime('%Y-%m-%d')
    headers = {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate, br, zstd",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Cache-Control": "no-cache",
        "Connection": "keep-alive",
        "Cookie": "_uab_collina=172827966864159075648991; JSESSIONID=8A54FAB2EAC4967564A7F83EDD7AB79B; _jc_save_czxxcx_toStation=%u5317%u4EAC%2CBJP; _jc_save_wfdc_flag=dc; _jc_save_czxxcx_fromDate=2024-10-08; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2024-10-07; _jc_save_toDate=2024-10-07; JSESSIONID=; CLIENT=wxgzh; tfstk=gqa-V1fu8tXuCpA28psmxHQpg3CcsyFzl8P6-vDkA-eY15JoA0iIhSGtnzmnPuqK9RVSFHqlapwYE-qnEY0SODw3eDmSqbYKA7DvrejrKeMIH8TnqJ4L0eFaTzfr-_uza2uCIObip7Pr8S0ZtHzJlZGaGeTWRNAhWhZAIObGouXX72WgEtYfcKhEhbTSVe1xcfGnRpM7dxij1fvSR2wCMmGsO39BP3gXGbkjd2gQdSMO03HeNvLLYY5yIXIejeY3kbn-peDWJvzWSck_vxLCCrhJdANSHeTIEbXmnSFleFPmzP2ts8bXyRFQ_kiYJK6tLrFbPkN2e9G4A80jEVsWM44zNliQ59-QB4eKfzivO6FuNY3xGP1Hbx4xEJa-c1Ytxqaif4Zc0TmnyfeQz8dpRRN0szo4JOpjLucZlXUF1HHKAgWaSPKCjdDtt31AMH-EVjP8NctRuGPZXjHGiSxeYmcqMAfAMH-EVjlxIsVDYHomg; _jc_save_fromStation=%u5317%u4EAC%2CBJP; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_toStation=%u4E0A%

原文地址:https://blog.csdn.net/liiukangkang/article/details/144029978

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!