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