Python实现查询12306火车票信息

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

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

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

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

  4、获取各个站点的代号,打开网面的源代码可以查询到汉字与代号的转换的URL:https://kyfw.12306.cn/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 南京 北京 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['<from>'])
    to_station = stations.get(arguments['<to>'])
    date = arguments['<date>']
    url = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT"%(date,from_station,to_station)
    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()

  

原文地址:https://www.cnblogs.com/Mail-maomao/p/6918754.html