zoukankan      html  css  js  c++  java
  • python打造12306余票实时监控

    # encoding=utf-8
    from Tkinter import *
    from ScrolledText import ScrolledText
    import urllib2
    import json
    import ssl
    import time
    import threading
    '''
    根据chrome 开发者模式取得城市代码参数,此步骤的目的通过中文去定位到对应英文城市代码
    '''
    citylist = open('C:UsersThinkDesktopcitylist.txt')
    city = citylist.read() # 把文件内容赋值给city
    citylist.close()
    # 取出城市对应代码,进行分割得到所需
    tmp_c = city.split('@')
    city_d = {}
    for i in tmp_c:
    if not i:
    continue # 因为第一位为空所以判断如果为空则继续循环,不为空继续
    city_d[i.split('|')[1]] = i.split('|')[2]
    # 城市对应城市代码生成的dic
    # 对应的座位类型,这里是硬卧

    city_s = city_d['北京']
    city_a = city_d['天津']
    seat = 'queryLeftNewDTO'
    yw = 'yw_num'
    '''
    12306证书验证会影响访问,所以要关闭掉
    '''
    ssl._create_default_https_context = ssl._create_unverified_context # 关闭证书验证

    #格式化字符串,把往返城市和时间写入并且访问
    def getList():
    s_time = '2017-04-20'
    html = urllib2.urlopen(
    "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT" % (
    s_time, city_s, city_a))
    content = html.read()
    text1 = json.loads(content) # json不是一个类型是一种表达方式
    # print text1
    return text1 # 转换成dic

    #根据座位类型查询火车票余票
    def train_name():
    train_name = getList()
    for i in train_name['data']: # 通过键值取到想要的信息,这里有个坑需要注意,这个字典里面又嵌套了一个字典以queryLeftNewDTO作为key,同时它也是一个value
    x = 0
    while i[seat][yw] == u'无': # 如果没票打印无票并且循环直到有票
    x += 1
    time1 = time.strftime('%Y-%m-%d %H:%M:%S')
    text.insert(END, u'检测时间%s: ' % time1)
    text.insert(END, u'第%d次查询: ' % x)
    text.insert(END, u'无票 ')
    time.sleep(2)
    else:
    print u'有票%s'%(i[seat][yw])
    # print u'第%d次查询:'%x
    # print u'无票'
    if i[seat][yw]!=u'无':#如果有票就打印出对应车次时间等等
    tmp = u'''车次:%s
    出发时间:%s
    到达时间:%s
    历时:%s
    硬卧:%s ''' % (i['queryLeftNewDTO']['station_train_code'], i['queryLeftNewDTO']['start_time'],
    i['queryLeftNewDTO']['arrive_time'], i['queryLeftNewDTO']['lishi'], i[seat][yw])
    text.insert(END,tmp)#将数据插入GUI用于显示

    # print trainlist

    #采用多线程进行处理
    def start():
    t1 = threading.Thread(target=train_name)
    t1.start()

    #建立一个GUI界面
    root = Tk()
    root.title(u'查询火车余票')
    root.state("zoomed")
    root.geometry('300x500')
    text = ScrolledText(root, font=('微软雅黑', 16))
    text.pack()

    button = Button(root, text=u'开始抢票', font=('微软雅黑', 16), command=start) # target目标函数名字切记不要()不然点击按钮就失效了
    button.pack()
    root.mainloop()

  • 相关阅读:
    当再多大公司慢慢的放弃微软的技术时, 不知大家怎想?
    【叶子函数分享五十四】汉字转拼音函数 [转]
    java_easyui体系之DataGrid(4)[转]
    java_easyui体系之DataGrid(3)[转]
    java_easyui体系之DataGrid(2)[转]
    java_easyui体系之DataGrid(1)[转]
    java_easyui体系之目录 [转]
    Java 并发和多线程(三) 多线程的代价 [转]
    Java 并发和多线程(二) 多线程的优点 [转]
    Java 并发和多线程(一) Java并发性和多线程介绍[转]
  • 原文地址:https://www.cnblogs.com/tom-gao/p/6674469.html
Copyright © 2011-2022 走看看