背景
在完成数据分析、挖掘的过程中,通过各种途径获取到的源数据有时候是不能直接利用的,需要再做进一步加工、处理、解析等操作,以致得到最终的目标结果。
1 获取源数据
- 使用Python从12306网站下载车次数据。数据地址(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'
- 代码效果:
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 数据结果简析
3 解析代码
- 总结
- 通过以上操作步骤,可以得到csv 格式的车次数据,该份数据在进行Python 开发过程中,使用起来会更方便(加载、持久化等),从而提高效率。
- 源代码 [码云]
- 参考文章:使用python爬取12306上面所有车次数据
- 注:该博文所解决的问题参考文章中并没有提供解析的方法,解析代码属原创代码;有关利用Python处理大文件的文章后则会后续更新。