,,教你用python实现12306余票查询

,,教你用python实现12306余票查询

今天我们就来讨论一下python对12306票以上查询的实现(pycharm python3.7),来体验一下python爬虫的简单做法。有需要的朋友可以参考一下。

python实现12306余票查询

我们先在浏览器中打开开发者工具(F12),尝试查询余票,通过开发者工具查看请求的套餐。

余票查询界面

如你所见,红框中的URL是我们对12306服务器的请求,那么它是什么呢?让我们来看看。

[

https://kyfw.12306.cn/otn/leftTicket/queryZ?left ticket dto . train _ date=2019-01-21 lefttticketdto . from _ station=cdwlefticket dto . to _ station=szq purpose _ codes=ADULT](https://kyfw . 12306 . cn/OTN/left ticket/query z?left ticket dto . train _ date=2019-01-21 lefttticketdto . from _ station=cdwlefticket dto . to _ station=szq purpose _ codes=成人)

您可以看到提出请求的几个字段:

LeftTicketDTO.train_date:查询的日期。

LeftTicketDTO.from_station:查询的起点

LeftTicketDTO.to_station:查询的目的地。

Purpose_codes:我不确定这个字段是做什么用的,就默认吧。

从我们提交的URL请求中可以看出,我们输入的成都和深圳都变成了对应的数字,比如成都(CDW)和深圳(SZQ),所以我们的程序输入的时候,要做一些处理。12306中的一个位置存储对应于这些城市名称和代码的文档:

[

https://kyfw . 12306 . cn/OTN/resources/js/framework/station _ name . js?station _ version=1.8971](https://kyfw . 12306 . cn/OTN/resources/js/framework/station _ name . js?站_版本=1.8971)

站点编码对应

让我们写一个小程序来提取这些城市的名称和编号:

导入re,请求

URL=' https://kyfw . 12306 . cn/OTN/resources/js/framework/station _ name . js?' station_version=1.8971 '

response=requests.get(url,verify=False)

#提取电台名称和代码。

chezhan=re . find all(r '([\ u4e 00-\ u9fa 5])\ |([A-Z])',response.text)

chezhan_code=dict(chezhan)

#交换

chezhan _ names=dict(zip(chezhan _ code . values()、chezhan_code.keys()))

#打印出获得的电台字典。

打印(站点名称)

获得的打印结果如下(仅显示部分屏幕):

{'VAP ':'北京北',' BOP ':'北京东',' BJP ':'北京',' VNP ':'北京南',' BXP ':'北京西',' IZQ ':

广州南,CUW:重庆北,CQW:重庆,CRW:重庆南,CXW:重庆西,GGQ:广州东,

'嘘':上海,SNH:上海,AOH:上海虹桥,SXH:上海西,TBP:天津北,' TJP;

天津,提示:天津南,TXP:天津西,XJA:香港西九龙,CCT:长春,CET:长春南,

' CRT ':长春西,ICW:成都东,CNW:成都南,CDW:成都,CSQ:长沙,' CWQ:

'长沙南',}

接下来,让我们开始编写程序的主要代码:

def main():

日期=输入('请输入时间(例如,2019年1月22日):\ n ')

from _ station=Chezhan _ code[input('请输入始发站:\n')]

To_station=chezhan_code[input('请输入目的站:\n')]

URL=' https://kyfw . 12306 . cn/OTN/left ticket/queryZ?'

标题={

用户代理':' Mozilla/5.0(Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/63 . 0 . 3239 . 26 Safari/537.36 Core/1 . 63 . 5702 . 400 QQ browser/10 . 2 . 1893 . 400 '

}

' URL=URL ' left ticket dto . train _ date=' date ' left ticket dto . from _ station=' from _ station ' left ticket dto . to _ station=' to _ station ' purpose _ codes=成人'

#print(url)已检查生成的url是否正确。

#request请求获取主页。

r=requests.get(url,headers=headers)

R.raise_for_status() #如果发送了错误请求,将会抛出异常

编码=表观编码

演出票(r.text)

用户输入时间、起始站点和目的站点,然后通过get请求,然后我们解析返回的网页信息。现在我们将打印上面代码的r.text,看看我们的请求后返回了什么样的信息,然后决定我们应该如何解析它。

运行结果

这样看起来不方便,所以我们贴在记事本上详细分析一下:

请求返回的结果信息

对比12306显示的信息,K829是车次,CDW和BJQ是始发地和目的地,10:10是发车时间,06:13是到站时间,44:21是经过时间,20190123是查询日期,其余是一系列车票的各种信息。

以下是对这些返回信息的分析。其实这也是python爬虫的关键,就是分析!

让我们首先将信息转换成json格式。可以看到,都是用“|”隔开的,所以我们用split函数把它拆分出来。以下是主要功能代码:

def showTicket(html):

html=json.loads(html)

Table=PrettyTable(['车次','始发站','到达站','出发时间','到达时间','持续时间','商务舱','一等舱','二等舱','高级软卧','软卧','动卧','硬卧)

对于html中的I['数据']['结果']:

name=[

'车站_列车_代码',

“发件人站名”,

'收件人站名',

'开始时间',

'到达时间',

李氏',

' swz_num ',

zy_num ',

' ze_num ',

'数据仓库编号',

gr_num ',

rw_num ',

' yw_num ',

'归零编号',

' yz_num ',

' wz_num ',

qt_num ',

'备注数量'

]

数据={

车站_列车_代码': ',

“发件站名称”:”,

收件人站名“:”,

开始时间“:”,

到达时间“:”,

离石“:”,

swz_num“:”,

zy_num ':' ',

ze_num ':' ',

“dw_num”:”,

gr_num ':' ',

rw_num“:”,

yw_num ':' ',

rz_num“:”,

yz_num ':' ',

“wz_num”:“”,

qt_num ':' ',

注释编号': ''

}

#提取并分配各种信息。

Item=i.split('|') #使用' | '进行拆分

data[' station _ train _ code ']=item[3]#获取车次信息,车次在3号位。

data[' from _ station _ name ']=item[6]#始发站的信息在位置6。

data[' to _ station _ name ']=item[7]#终端信息位于位置7。

Data['start_time']=item[8] #出发时间在第8位。

Data['arrive_time']=item[9] #到达时间在第9个位置。

Data['lishi']=item[10] #经过的时间在第10个位置。

Data ['swz _ num']=item [32]或item [25] #特别注意商务座在32或25的位置。

Data['zy_num']=item[31] #头等舱座位信息在位置31

Data['ze_num']=item[30] #二等座信息在位置30

Data['gr_num']=item[21] #高级软卧信息在第21个位置。

Data['rw_num']=item[23] #软卧信息在第23个位置。

Data['dw_num']=item[27] #移动卧室信息在第27位。

Data['yw_num']=item[28] #硬卧的信息在第28个位置。

Data['rz_num']=item[24] #软座信息在第24位。

Data['yz_num']=item[29] #硬座信息在第29位。

Data['wz_num']=item[26] #没有座位信息位于位置26

Data['qt_num']=item[22] #其他信息在第22位。

Data['note_num']=item[1] #注释信息位于位置1。

color=彩色()

data[' note _ num ']=color . white(item[1])

#如果没有信息,则用“-”代替

对于以名称发布:

如果数据[位置]==' ':

数据[位置]='-'

门票=[]

cont=[]

续附加(数据)

对于连续的中的x:

tmp=[]

对于名称中的y:

if y=='from_station_name ':

s=颜色。绿色(chezhan _ names[data[' from _ station _ name ']])

tmp。追加

elif y=='to_station_name ':

s=颜色。红色(车站名称[数据['至车站名称']])

tmp。追加

elif y=='start_time ':

s=颜色。绿色(数据['开始时间'])

tmp。追加

elif y=='到达时间:

s=颜色.红色(数据['到达时间'])

tmp。追加

elif y=='station_train_code ':

s=颜色.黄色(数据['车站_列车_代码'])

tmp。追加

否则:

tmp.append(data[y])

tickets.append(tmp)

对于票证中的票证:

table.add_row(票证)

打印(表格)

那么我们程序就成功啦!

运行结果

但是在编译器里面漂亮的桌子的格子没有对齐,不要担心,我们到终端运行一下脚本,就可以看到很好看的输出啦:

终端运行结果

完成!下面是完整代码

main.py

# -*-编码:utf-8 -*-

导入请求、日期时间、时间、json

从漂亮的桌子进口漂亮的桌子

从彩色光导入初始化,Fore

从stationinfo导入站点代码,站点名称

初始化(自动重置=假)

彩色类别(对象):

def yeah(self,s):

返回船头LIGHTCYAN_EX s Fore .重置

定义绿色(自身,s):

返回船头。浅绿色。重置

定义黄色(自身,s):

返回船头。浅黄色_EX s Fore .重置

def白色(自身,s):

返回船头LIGHTWHITE_EX s Fore .重置

极好的蓝色(自身,s):

返回船头。浅蓝色_EX s Fore .重置

def showTicket(html):

html=json.loads(html)

table=PrettyTable(['车次','出发车站','到达车站','出发时间','到达时间',' 历时','商务座',' 一等座','二等座','高级软卧','软卧','动卧','硬卧','软座','硬座','无座','其他','备注'])

对于超文本标记语言中的我['数据']['结果']:

name=[

'车站_列车_代码,

"发件人站名",

'收件人站名,

'开始时间,

'到达时间,

李氏,

' swz_num ',

zy_num ',

' ze_num ',

'数据仓库编号,

gr_num ',

rw_num ',

' yw_num ',

'归零编号,

' yz_num ',

' wz_num ',

qt_num ',

'备注数量'

]

数据={

车站_列车_代码': ',

"发件站名称":",

收件人站名":",

开始时间":",

到达时间":",

离石":",

swz_num ":",

zy_num ':' ',

ze_num ':' ',

" dw_num ":",

gr_num ':' ',

rw_num ":",

yw_num ':' ',

rz_num ":",

yz_num ':' ',

" wz_num ":" ",

qt_num ':' ',

注释编号': ''

}

#将各项信息提取并赋值

item=i.split('|') #使用"|"进行分割

数据['车站_列车_代码']=项目[3] #获取车次信息,在3号位置

数据['发件人站名']=项目[6] #始发站信息在6号位置

数据['收件人站名]=item[7] #终点站信息在七号位置

数据['开始时间']=项目[8] #出发时间在8号位置

数据['到达时间]=item[9] #抵达时间在9号位置

data['lishi']=item[10] #经历时间在10号位置

data['swz_num']=项目[32]或项目[25] #特别注意,商务座在32或25位置

data['zy_num']=item[31] #一等座信息在31号位置

data['ze_num']=item[30] #二等座信息在30号位置

data['gr_num']=item[21] #高级软卧信息在21号位置

data['rw_num']=item[23] #软卧信息在23号位置

data['dw_num']=item[27] #动卧信息在27号位置

data['yw_num']=item[28] #硬卧信息在28号位置

data['rz_num']=item[24] #软座信息在24号位置

data['yz_num']=item[29] #硬座信息在29号位置

data['wz_num']=item[26] #无座信息在26号位置

data['qt_num']=item[22] #其他信息在22号位置

数据['注释编号']=项目[1] #备注信息在一号位置

颜色=彩色()

data[' note _ num ']=颜色。白色(项目[1])

#如果没有信息,那么就用"-"代替

对于以名称发布:

如果数据[位置]==' ':

数据[位置]='-'

门票=[]

cont=[]

续附加(数据)

对于连续的中的x:

tmp=[]

对于名称中的y:

if y=='from_station_name ':

s=颜色。绿色(chezhan _ names[data[' from _ station _ name ']])

tmp。追加

elif y=='to_station_name ':

s=颜色。是(chezhan _ names[data[' to _ station _ name ']])

tmp。追加

elif y=='start_time ':

s=颜色。绿色(数据['开始时间'])

tmp。追加

elif y=='到达时间:

s=颜色。是(数据['到达时间'])

tmp。追加

elif y=='station_train_code ':

s=颜色.黄色(数据['车站_列车_代码'])

tmp。追加

否则:

tmp.append(data[y])

tickets.append(tmp)

对于票证中的票证:

table.add_row(票证)

打印(表格)

def main():

日期=输入('请输入时间:\n ')

from _ station=chezhan _ code[input('请输入起始站点:\n')]

to_station=chezhan_code[input('请输入目的站点:\n')]

URL=' https://kyfw。12306 .' cn/OTN/左票/queryZ?'

标题={

用户代理:' Mozilla/5.0(Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/63。0 .3239 .26 Safari/537.36 Core/1。63 .5702 .400 QQ浏览器/10。2 .1893 .400 '

}

URL=URL '左票dto。train _ date=' date '左票dto。from _ station=' from _ station '左票dto。to _ station=' to _ station '目的代码=成人'

#打印(网址)已经检查过生成的统一资源定位器是正确的

#请求请求获取主页

r=requests.get(url,headers=headers)

r.raise_for_status()如果发送了一个错误的请求,会抛出异常

编码=表观编码

演出票(正文)

#打印(正文)

主()

stationinfo.py

导入re,请求

URL=' https://kyfw。12306 .cn/OTN/资源/js/框架/站名。js,”' station_version=1.8971 '

response=requests.get(url,verify=False)

#将车站的名字和编码进行提取

chezhan=re。find all(r '([\ u4e 00-\ u9fa 5])\ |([A-Z])',response.text)

chezhan_code=dict(chezhan)

chezhan _ names=dict(zip(chezhan _ code。values()、chezhan_code.keys()))

#打印(车战名称)

到此这篇关于教你用大蟒实现12306余票查询的文章就介绍到这了,更多相关大蟒实现12306余票查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: