python爬虫应用

Python爬取12306实现火车票查询
环境:win10、python3.7、pycharm2019.1、cpu

#coding:utf-8
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’
download_tnumber_datas(tn_datas_url);

解析下载的的车次数据(近1个月) | 数据来源于12306(js 文件)

def parse_datas_of_train_number(file_path):
text=open(file_path,encoding=‘utf8’).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 # 返回结果列表

数据持久化

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 文件中

程序运行成功后会生成两个文件
python爬虫应用_第1张图片

你可能感兴趣的:(python爬虫应用)