如果你是一名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:返回元组,用于验证数据完整性。
本文作者为wzzyhg,转载请注明。