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