700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python实现查询12306火车票信息

Python实现查询12306火车票信息

时间:2020-01-29 09:15:45

相关推荐

Python实现查询12306火车票信息

例子来源于马哥的公众号,看了几遍,有些地方存在些疑问,然后就自己查找些资料,重写的一下,但是对于获取到的信息,并不能有效的解析出来,而且对于中文字符处理,并不是很好,请大神指教下!谢过!

1、接口设置:用户只要输入出发站,到达站及日期就能查到火车信息;python tickets [-hgdtkz] from to date

2、解析参数,使用docopt模块

3、获取数据,打开12306官网余票查询的界面,浏览器按F2到开发人员工具界面,点击network标签,再点击查询,有查询URL,这个将是我们要使用的URL,但是发现from_station 和to_station并不是汉字,是一个代号;

4、获取各个站点的代号,打开网面的源代码可以查询到汉字与代号的转换的URL:/otn/resources/js/framework/station_name.js?station_version=1.9010

5、将用户的请求转换为站点代号再请求数据;

第一步:

先获取站点的代号(调用函数时将转换URL代入参数即可):

def Main(IP):

Re = urllib2.Request(IP)

try:

Response = urllib2.urlopen(Re,timeout=5)

with open ('./urllib2_content.txt','w+') as fp:

fp.write(Response.read())

print "目标地址为:%s"%Response.geturl()

print "目标返回代码为:%s"%Response.getcode()

print "目标信息为:%s"%Response.info()

print "已获取目标主机内容,存放当前目录下的urllib2_content.txt,请自行查看!!!"

第二步:解析站点代码(此部分没有很好解决中文字符的匹配)

#!/usr/bin/env python

#coding:utf-8

import re

with open('urllib2_content.txt') as fp:

text = fp.read()

stations = re.findall(u"([\x80-\xff]+)\|([A-Z]+)",text)

for i in stations:

print "\""+i[0]+"\""+" : "+"\""+i[1]+"\""+","

第三步:将解析后的代码制作成字典(部分内容)

#!/usr/bin/env python

#coding:utf-8

stations = {"北京北" : "VAP",

"北京东" : "BOP",

"北京" : "BJP",

"北京南" : "VNP",

"北京西" : "BXP"......}

第四步:请求转换

#!/usr/bin/env python#coding:utf-8 """Train tickets query via command-line.Usage:tickets [-gdtkz] <from> <to> <date>Options:-h,--help 帮助-g 高铁-d 动车-t 特快-k 快车-z 直达Example:tickets 南京 北京 -07-01tickets -dg 南京 北京 -07-01"""import docopt,json,requestsfrom station import stationsdef cli():"""command-line interface"""arguments = docopt.docopt(__doc__)from_station = stations.get(arguments['<from>'])to_station = stations.get(arguments['<to>'])date = arguments['<date>']url = "/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT"%(date,from_station,to_station)j = 0r = requests.get(url,verify=False)for i in r.json()["data"]["result"]:print ij += 1print jif __name__ == "__main__":cli()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。