python爬虫之12306网站--火车票信息查询
python爬虫之12306网站--火车票信息查询
思路:
1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息
2.json文件存储当前从出发站到目的站的所有车次的详细信息
3.对json文件进行分析
4.分类查询车票(高铁、火车)
1.json文件:在12306页面选择"车票"》"单程",打开"开发人员工具",然后输入出发地、目的地

对json文件进行分析,发现是嵌套的字典,车次的所有详细信息存储在"result"中

选择一条数据然后对其进行分析,找到自己想要的数据(例如车次在的位置,出发站、到达站、座位的种类等等)
这里用的是notepad++软件,把"|"替换为"\r",这样就方便自己找到想要的数据对应的位置

代码如下:
#python 火车票信息的查询
import requests
url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090"
txt=requests.get(url1).text
inf=txt[:-2].split("@")[1:]
#print(inf)
stations={}
for record in inf:
rlist=record.split("|")
stations[rlist[2]]={"cn":rlist[1],"qp":rlist[3],"jp":rlist[4]} #把车站编码当作key
#print(stations)
def getcode(t):
while True:
s1=input("%s站:"%t)
r1=[]
for id,station in stations.items():
if s1 in station.values():
r1.append((id,station))
if r1:
break
print("没有这个车站。")
print("请重新输入。")
if len(r1)==1:
sid=r1[0][0]
else:
print("你需要在以下车站里选择:")
for i in range(len(r1)):
print(i+1,r1[i][1]["cn"])
sel=int(input("你的选择是:"))-1
sid=r1[sel][0]
return sid
fromstation=getcode("出发")
tostation=getcode("到达")
chufatime=input("出发日期(格式2019-01-01):").strip()
qurl="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(chufatime,fromstation,tostation)
print(qurl)
print("你输入的查询条件是:出发站=%s,到达站=%s"%(stations[fromstation]["cn"],stations[tostation]["cn"]))
ainf=requests.get(qurl).json()["data"]["result"] #json文件存储当前从出发站到目的站的所有车次的详细信息
#print(ainf,type(ainf))
result=[]
for i in ainf:
list=i.split("|")
checi=list[3]
chufa=stations[list[6]]["cn"]
mudi=stations[list[7]]["cn"]
ftime=list[8]
dtime=list[9]
sw=list[32]
yd=list[31]
rw=list[23]
yw=list[26]
wuzuo=list[28]
ed=list[30]
yz=list[29]
result.append((checi,chufa,mudi,ftime,dtime,sw,yd,ed,yz,yw,rw,wuzuo))
#print(result)
print("车次\t出发站\t到达站 出发时间 到达时间 商务座 一等座 二等座 硬座 硬卧 软卧 无座 ")
for i in result:
for n in range(len(i)):
print(i[n],end="\t")
print()
运行效果如下:


上面显示的太不友好了,这里用prettytable库(需要安装)
from prettytable import PrettyTable
............
............
table=PrettyTable(["车次","出发站","目的站","发车时间","到达时间","商务座","一等座","二等座","硬座","硬卧","软卧","无座"])
for i in result:
table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10],i[11]])
print(table)
运行效果如下:

4.分类查询车票
import requests
from prettytable import PrettyTable
url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090"
txt=requests.get(url1).text
inf=txt[:-2].split("@")[1:]
#print(inf)
stations={}
for record in inf:
rlist=record.split("|")
stations[rlist[2]]={"cn":rlist[1],"qp":rlist[3],"jp":rlist[4]} #把车站编码当作key
#print(stations)
def getcode(t):
while True:
s1=input("%s站:"%t)
r1=[]
for id,station in stations.items():
if s1 in station.values():
r1.append((id,station))
if r1:
break
print("没有这个车站。")
print("请重新输入。")
if len(r1)==1:
sid=r1[0][0]
else:
print("你需要在以下车站里选择:")
for i in range(len(r1)):
print(i+1,r1[i][1]["cn"])
sel=int(input("你的选择是:"))-1
sid=r1[sel][0]
return sid
fromstation=getcode("出发")
tostation=getcode("到达")
chufatime=input("出发日期(格式2019-01-01):").strip()
qurl="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(chufatime,fromstation,tostation)
print(qurl)
print("你输入的查询条件是:出发站=%s,到达站=%s"%(stations[fromstation]["cn"],stations[tostation]["cn"]))
ainf=requests.get(qurl).json()["data"]["result"] #json文件存储当前从出发站到目的站的所有车次的详细信息
#print(ainf,type(ainf))
result=[]
gaotie=[]
huoche=[]
for i in ainf:
list=i.split("|")
checi=list[3]
chufa=stations[list[6]]["cn"]
mudi=stations[list[7]]["cn"]
ftime=list[8]
dtime=list[9]
sw=list[32]
yd=list[31]
rw=list[23]
yw=list[26]
wuzuo=list[28]
ed=list[30]
yz=list[29]
result.append((checi,chufa,mudi,ftime,dtime,sw,yd,ed,yz,yw,rw,wuzuo))
if checi[0] in ["G","D"]:
gaotie.append([checi,chufa,mudi,ftime,dtime,sw,yd,ed])
else:
huoche.append([checi,chufa,mudi,ftime,dtime,yz,yw,rw,wuzuo])
#print(result)
while True:
print("请输入查看信息:1、全部 2、高铁、动车 3、火车 4、退出")
show=int(input("请选择:"))
if show==1:
table=PrettyTable(["车次","出发站","目的站","发车时间","到达时间","商务座","一等座","二等座","硬座","硬卧","软卧","无座"])
for i in result:
table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8],i[9],i[10],i[11]])
print(table)
elif show==2:
table=PrettyTable(["车次","出发站","目的站","发车时间","到达时间","商务座","一等座","二等座"])
for i in gaotie:
table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7]])
print(table)
elif show==3:
table=PrettyTable(["车次","出发站","目的站","发车时间","到达时间","硬座","硬卧","软卧","无座"])
for i in huoche:
table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8]])
print(table)
elif show==4:
print("查询结束!")
break
else:
print("输入错误请重新输入!")
运行效果如下:


python爬虫之12306网站--火车票信息查询的更多相关文章
- python爬虫之12306网站--车站信息查询
python爬虫查询车站信息 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息进行处理 python爬虫查询全拼相同的车站 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息 ...
- python爬虫之天气预报网站--查看最近(15天)的天气信息(正则表达式)
python爬虫之天气预报网站--查看最近(15天)的天气信息(正则表达式) 思路: 1.首先找到一个自己想要查看天气预报的网站,选择自己想查看的地方,查看天气(例:http://www.tianqi ...
- python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...
- python爬虫抓取哈尔滨天气信息(静态爬虫)
python 爬虫 爬取哈尔滨天气信息 - http://www.weather.com.cn/weather/101050101.shtml 环境: windows7 python3.4(pip i ...
- python爬虫之小说网站--下载小说(正则表达式)
python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...
- Python爬虫某招聘网站的岗位信息
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:阿尔法游戏 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- 简单的python爬虫--爬取Taobao淘女郎信息
最近在学Python的爬虫,顺便就练习了一下爬取淘宝上的淘女郎信息:手法简单,由于淘宝网站本上做了很多的防爬措施,应此效果不太好! 爬虫的入口:https://mm.taobao.com/json/r ...
- python爬虫1——获取网站源代码(豆瓣图书top250信息)
# -*- coding: utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding('utf ...
- python爬虫--模拟12306登录
模拟12306登录 超级鹰: #!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Ch ...
随机推荐
- Python从入门到精通系列文章总目录
Python最新全套课程(8月中旬开的课),共四个月.所有课件,项目源码,课后习题和答案都包括在内. 包括:Python实战项目引入.Python基础.爬虫基础.爬虫库.Scrapy爬虫框架.动态页面 ...
- MyBatis源码解析(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...
- 记一次SpringBoot 开发中所遇到的坑和解决方法
记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...
- retry重试常见场景及实现
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现. ...
- MySQL小计
判断不等于某一个数字的时候,数据表为空的字段不参与比较: 判断字段为空用 is null
- PXC快速入门
1.快速入门 实验环境: Node Host IP Node1 pxc1 192.168.70.61 Node2 pxc2 192.168.70.62 Node3 pxc3 192.168.70.63 ...
- .Net NPOI 根据excel模板导出excel、直接生成excel
一.根据Excel模板导出excel 1.导入NPOI.dll 2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...
- c# 大批量用户访问数据库报错
报错信息:There is already an open DataReader associated with this Connection which must be closed first ...
- 6.3 OrderBy 优化
1. 创建实例 create table tblA( age int, birth TIMESTAMP not null ); insert into tblA(age,birth) values(2 ...
- for、for / in循环
1.for循环 循环代码块一定的次数 <!DOCTYPE html> <html lang="en" dir="ltr"> <he ...