zoukankan      html  css  js  c++  java
  • 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()
    

      

  • 相关阅读:
    Caused by: org.xml.sax.SAXParseException; lineNumber: 29; columnNumber: 107; 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mucp.QRTZ_TRIGGERS' doesn't exist
    ava.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号
    activitemq启动时出现 ERROR: java.lang.RuntimeException: Failed to execute start task. Reason: java.lang.IllegalStateException: BeanFactory
    sql 替换
    tomcat 点击startup.bat会闪退
    java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
    运行rviz出现以下问题
    rosplan ---AI planning
    ros 地图.pgm文件编辑
  • 原文地址:https://www.cnblogs.com/Mail-maomao/p/6918754.html
Copyright © 2011-2022 走看看