12306 大题

wzzyhg 57 0

如果你是一名Python培训师,请给学员讲述下列程序代码。

# 爬取铁路12306火车站车票数据
# https://www.12306.cn/index/otn/index12306/queryAllCacheSaleTime
# Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 SE 2.X MetaSr 1.0

import time
import requests
import pandas as pd
from datetime import datetime

url = "https://www.12306.cn/index/otn/index12306/queryAllCacheSaleTime"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 SE 2.X MetaSr 1.0"
}

response = requests.get(url=url, headers=headers)
time.sleep(3)  # 防止被检测

data_list = pd.json_normalize(response.json()['data'], errors='ignore')

if __name__ == '__main__':
    curr_time = datetime.now()
    timestamp = datetime.strftime(curr_time, '%Y-%m-%d_%H-%M-%S')

    # 保存为 Excel 文件
    data_list.to_excel(f"全国火车站-{timestamp}.xlsx", index=False)
    print("保存完成!")

    # 打印行列数
    rows_colums = data_list.shape
    print("请求得到的表格行数与列数", rows_colums)

同学们,今天我们来看一段完整的Python代码,它的功能是从铁路12306官网抓取全国火车站的售票时间数据,并将结果保存为Excel文件。代码虽然简短,但涵盖了爬虫的核心流程:请求数据、解析数据、存储数据。下面我们分步骤详细讲解。

import time
import requests
import pandas as pd
from datetime import datetime

1️⃣ 先导入必要的库。
• time:用于控制请求频率,防止被封禁;
• requests:负责网络请求,拿数据;
• pandas:数据处理,支持Excel导出;
• datetime:获取当前时间,生成唯一文件名。

url = "https://www.12306.cn/index/otn/index12306/queryAllCacheSaleTime"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 SE 2.X MetaSr 1.0"
}

2️⃣ 下面定义目标API接口,设置请求头,模拟浏览器访问。
• URL:这是12306公开的API接口,返回JSON格式的售票时间数据。
• headers 里的 User-Agent:告诉服务器“我是浏览器,不是机器人”,不设置此头可能被拒绝访问。

🔍 如何获取 User-Agent?

在浏览器中按 F12 打开开发者工具 → 网络(Network) → 点击任意请求 → 查看请求头中的 User-Agent 字段。

response = requests.get(url=url, headers=headers)
time.sleep(3)  # 防止被检测

3️⃣ 发送GET请求获取数据,暂停3秒,避免触发反爬机制。
• requests.get():发送请求,服务器返回数据(JSON格式)
• response 对象:包含服务器返回的所有信息
• time.sleep(3):暂停3秒,避免请求太快被反爬虫识别封禁

data_list = pd.json_normalize(response.json()['data'], errors='ignore')

4️⃣ 解析JSON数据并转换为表格。
• response.json():可直接将 JSON 内容解析为 Python 字典
• pd.json_normalize():将嵌套的 JSON 数据展开成表格形式
• errors='ignore':忽略解析中的非致命错误

if __name__ == '__main__':
    curr_time = datetime.now()
    timestamp = datetime.strftime(curr_time, '%Y-%m-%d_%H-%M-%S')

    # 保存为 Excel 文件
    data_list.to_excel(f"全国火车站-{timestamp}.xlsx", index=False)
    print("保存完成!")

    # 打印行列数
    rows_colums = data_list.shape
    print("请求得到的表格行数与列数", rows_colums)

5️⃣ if name == 'main': 的作用

这部分代码只在直接运行本文件时执行,避免被别人导入时自动运行。
• 时间戳的作用:动态生成文件名,避免覆盖旧文件。
• to_excel() 参数:index=False 表示不保存行号。
• data_list.shape:返回元组,用于验证数据完整性。

发表评论 取消回复
表情 图片 链接 代码

分享