0
点赞
收藏
分享

微信扫一扫

Python 解析爬取的车次数据(12306)

boomwu 2022-08-23 阅读 81


背景

   在完成数据分析、挖掘的过程中,通过各种途径获取到的源数据有时候是不能直接利用的,需要再做进一步加工、处理、解析等操作,以致得到最终的目标结果。

1 获取源数据

  • 使用Python12306网站下载车次数据。​​数据地址(URL)​​
  • 下载代码:
  • 执行环境:Jupyter Notebook

import re
import json
import requests
import pandas as pd

'''
下载所有的车次数据 | 保存为 tnumber_datas.txt 文件
'''
def download_tnumber_datas(tn_datas_url):
requests.adapters.DEFAULT_RETRIES = 5
response = requests.get(tn_datas_url, stream=True,verify=False)
status = response.status_code
if status == 200:
with open('tnumber_datas.txt', 'wb') as tfile:
for chunk in response.iter_content(chunk_size=102400): # 成块读取数据
if chunk:
tfile.write(chunk)

tn_datas_url='https://kyfw.12306.cn/otn/resources/js/query/train_list.js?scriptVersion=1.0'

  • 代码效果:

Python 解析爬取的车次数据(12306)_python

2 解析数据

  • 数据格式:
    ​​​var train_list = {"2017-11-17" : { "D" : [{ "station_train_code":"D1(北京-沈阳)", "train_no":"24000000D10W" }, ... ]}}​
  • 数据大小(file_size ≈
2.1 问题
  • 如何利用Python解析大文件?
  • 利用Python进行本地数据处理(解析),数据量限度范围(多少数据量合适)。【待总结】
  • 利用Python等语言处理大文件数据的方式(方法)总结。【待总结】
2.2 解析代码
2.2.1 代码解析

'''
解析下载的的车次数据(近1个月) | 数据来源于12306(js 文件)
'''
def parse_datas_of_train_number(file_path):
text=open(file_path).read() # 1 读取目标数据文件
dts=re.findall('"([0-9]{4}-[0-9]{0,2}-[0-9]{0,2})":\{',text) # 2 解析出所有的日期(key)
train_list=re.findall(r'=(.*)',text)[0] # 3 解析出数据
train_json=json.loads(train_list) # 4 将数据载入字典

trains=[] # 存储结果数据
for dt in dts:
tjson_dt=train_json.get(dt) # 所有日期
keys=tjson_dt.keys() # 所有的车次类型,C,D,G,K,O,T,Z
for key in keys:
dicts=tjson_dt.get(key) # 取出对应类型的车次数据
for dic in dicts:
station_train_code=dic.get('station_train_code')
train_no=dic.get('train_no')
trains.append([dt,station_train_code,key,train_no])

return trains # 返回结果列表

2.2.2 数据持久化

trains=parse_datas_of_train_number('./tnumber_datas.txt') # 源数据文件路径(第一步的下载数据)
trains_df=pd.DataFrame(trains)
trains_df.columns=['dt','station_train_code','train_type','train_no']

trains_df.to_csv('tnumber_datas.csv',encoding='utf8') # 将数据持久化至 tnumber_datas.csv 文件中

2.2.3 数据结果简析

Python 解析爬取的车次数据(12306)_python_02

3 解析代码

  • 总结
  • 通过以上操作步骤,可以得到csv 格式的车次数据,该份数据在进行Python 开发过程中,使用起来会更方便(加载、持久化等),从而提高效率。
  • ​​源代码 [码云]​​
  • 参考文章:使用python爬取12306上面所有车次数据
  • 注:该博文所解决的问题参考文章中并没有提供解析的方法,解析代码属原创代码;有关利用Python处理大文件的文章后则会后续更新。


举报

相关推荐

0 条评论