python查询12306余票_Python实现查询12306火车票信息
实例源自马哥公众号的内容。再三阅读后发现了一些疑点尚存处也,请问各位专家赐教!随后自行查阅相关资料重新整理一下内容也行:但这些信息难以有效分析导致中文字符处理效果不佳还望各位专家赐教!多谢关注!
接口设置:用户只需要提供起始车站、终点车站以及查询日期就可以查找到相关信息;python tickets [-hgdtkz] from to date
2、解析参数,使用docopt模块
3、收集信息时,请访问12306官方网站的余票信息查询功能页面,在通过浏览器进入开发者工具中的网络调试模式后单击'network'标签项并点击'查询'按钮即可获取对应的URL地址;此URL即为我们后续操作所需的资源链接;但需注意的是,在操作过程中会发现from_station和to_station字段并非使用中文字符编码而是采用了特定编码标识;
查找各个站点对应的代号编号,在该页面中可以通过访问该URL链接,可以获得汉字与其对应代号之间的转换关系
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]
Options:
-h,--help 帮助
-g 高铁
-d 动车
-t 特快
-k 快车
-z 直达
Example:
tickets 南京 北京 2016-07-01
tickets -dg 南京 北京 2016-07-01
"""
import docopt,json,requestsfrom station import stations
def cli():
"""command-line interface"""
arguments = docopt.docopt(doc)
from_station = stations.get(arguments[''])
to_station = stations.get(arguments[''])
date = arguments['']
将变量url赋值为从网站"https://kyfw.12306.cn/otn/leftTicket/query"获取的左边票务信息请求,并在该请求中设置左边票务日期字段为%1s、起始站字段为%2s、终点站字段为%3s以及目的代码字段指定为%4s。
j = 0
r = requests.get(url,verify=False)
for i in r.json()["data"]["result"]:
print i
j += 1
print j
if name == "main":
cli()
