利用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%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924010.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Hooks中use的细节

文档 useState useState如果是以函数作为参数,那要求是一个纯函数,不接受任何参数,同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值,当以一个函数作为参数进行传入的时候需要注意&#xff…

2024 TIP 论文 robust-ref-seg 复现过程

本篇是 2024 年 TIP 论文 Toward Robust Referring Image Segmentation 的复现过程。 特点是对不存在的目标不会进行错误分割,鲁棒性较高,其结果如图: 配置环境 根据论文给出的链接 robust-ref-seg 配置环境。 下载数据集 按照 README 指…

数据结构(初阶6)---二叉树(遍历——递归的艺术)(详解)

二叉树的遍历与练习 一.二叉树的基本遍历形式1.前序遍历(深度优先遍历)2.中序遍历(深度优先遍历)3.后序遍历(深度优先遍历)4.层序遍历!!(广度优先遍历) 二.二叉树的leetcode小练习1.判断平衡二叉树1)正常解法2)优化解法 2.对称二叉…

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注:关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群,然后在本机上使用nfs-su…

C++ For Hot100

数组&#xff1a;数组是存放在连续内存空间上的相同类型数据的集合。 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;for(int i 0;i<nums.size…

高校宿舍节能用电现状及智慧监管平台构建

0 引言 在节能减排的大背景下&#xff0c;高校通过精细化宿舍用电管理&#xff0c;提升师生的节能节电意识等举措&#xff0c;能够显著提高电能资源的使用效率&#xff0c;并有效预防火灾等安全事故&#xff0c;确保师生的人身安全。因此&#xff0c;当前亟需加强对智慧监管平…

Spring Boot英语知识网站:开发策略

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 英语知识应用网站的系统管理员可以对用户信息添加修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 在线学习管理 系统管理员可以对在线学习信息进行添加&#xff0c;修改&#xff0…

Jmeter中的前置处理器

5&#xff09;前置处理器 1--JSR223 PreProcessor 功能特点 自定义数据处理&#xff1a;使用脚本语言处理请求数据&#xff0c;实现高度定制化的数据处理和生成。动态数据生成&#xff1a;在请求发送前生成动态数据&#xff0c;如随机数、时间戳等。变量设置&#xff1a;设置…

华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座

HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核&#xff0c;鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征&#xff0c;性能超越Linux内核10.7%。 鸿蒙内核更弹性&#xff1a;元OS架构&#xff0c;性能安全双收益 万…

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks 学习笔记

1 Contributions 混合显式-隐式网络架构&#xff1a;提出了一种 Tri-plane 的3D表征方法&#xff0c;结合显式体素网格与隐式解码器的优点 速度快&#xff0c;内存效率高&#xff1b; 支持高分辨率生成&#xff0c;保持3D表征的灵活性和表达能力。与纯显式或隐式方法相比&#…

【数据结构OJ】相交链表问题,求相交链表的相交第一个交点

题目如下&#xff08;题目来源力扣&#xff09;&#xff1a; 个人解题思路&#xff1a; 运用双指针&#xff0c;第一次遍历先一起走&#xff0c;当一个走到尾时开始计数&#xff0c;等另一个指针也走到尾时记录下两个指针的路程差&#xff0c;同时比对两个指针指向的地址是否相…

【C语言】指针与数组的例题详解:深入分析与高级用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目一详细分析与解答代码逐步解析 &#x1f4af;进一步优化和拓展1. 指针与数组的关系2. 指针运算的注意事项3. 常见的错误和陷阱4. 拓展&#xff1a;指针操作的应用场…

【Java】ArrayList与LinkedList详解!!!

目录 一&#x1f31e;、List 1&#x1f345;.什么是List&#xff1f; 2&#x1f345;.List中的常用方法 二&#x1f31e;、ArrayList 1&#x1f34d;.什么是ArrayList? 2&#x1f34d;.ArrayList的实例化 3&#x1f34d;.ArrayList的使用 4&#x1f34d;.ArrayList的遍…

【SQL Server】华中农业大学空间数据库实验报告 实验六 视图

1.实验目的 通过课堂理论学习与实验课的实际操作&#xff0c;充分理解视图的相关概念&#xff0c;作用&#xff0c;以及特点&#xff0c;视图中定义的是对一个或多个基本表的查询语句&#xff0c;其本身并不保存数据&#xff0c;所有的数据都存储在数据库的表中&#xff0c;因…

javaweb-day01-html和css初识

html:超文本标记语言 CSS&#xff1a;层叠样式表 1.html实现新浪新闻页面 1.1 标题排版 效果图&#xff1a; 1.2 标题颜色样式 1.3 标签内颜色样式 1.4设置超链接 1.5 正文排版 1.6 页面布局–盒子 &#xff08;1&#xff09;盒子模型 &#xff08;2&#xff09;页面布局…

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview&#xff0c;在回顾复习一次webview相…

【微服务架构】Kubernetes与Docker在微服务架构中的最佳实践(详尽教程)

文章目录 什么是微服务架构Docker在微服务中的应用Docker基础Docker的核心组件 Docker在微服务中的优势 Kubernetes在微服务中的应用Kubernetes基础Kubernetes的核心组件 Kubernetes在微服务中的优势 Kubernetes与Docker的集成最佳实践容器化微服务服务发现与负载均衡自动化部署…

深入了解JDK动态代理

什么是JDK动态代理 &#xff08;有动态代理&#xff0c;就有静态代理&#xff0c;参见&#xff1a;多线程03--静态代理模式_runnable接口静态代理模式-CSDN博客&#xff09; JDK动态代理是Java提供的一种动态生成代理对象的机制&#xff0c;允许在运行时创建一个实现了指定接口…

C#基础56-60

56.字符数组x中存有任意一串字符&#xff1b;串中的所有小写字母改写成大写字母&#xff0c;如果是大写字母改为小写字母&#xff0c;其他字符不变。最后把已处理的字符串仍重新存入字符数组x中&#xff0c;最后调用函数把结果输出到控制台中。 57.求出100以上1000以内所有个位…

华为IPD流程管理体系L1至L5最佳实践-解读

该文档主要介绍了华为IPD流程管理体系&#xff0c;包括流程体系架构、流程框架实施方法、各业务流程框架示例以及相关案例等内容&#xff0c;旨在帮助企业建立高效、规范的流程管理体系&#xff0c;实现业务的持续优化和发展。具体内容如下&#xff1a; 1. 华为流程体系概述 -…