python实现2014火车票查询代码分享


Posted in Python onJanuary 10, 2014

代码基于Python3.3.3,PyQt5.1.1

# -*- coding: utf-8 -*-
# Python 3.3.3
# PyQt 5.1.1
import sys,time,re,urllib.parse,urllib.request,http.cookiejar,json
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
"""cookie"""
cookie=http.cookiejar.LWPCookieJar()
#cookie.load('f:/cookie.txt',True,True)
chandle=urllib.request.HTTPCookieProcessor(cookie)
"""获取数据"""
def getData(url):
    r=urllib.request.Request(url)
    opener=urllib.request.build_opener(chandle)
    u=opener.open(r)
    #chandle.cookiejar.save('f:/cookie.txt',True,True)
    data=u.read()
    try:
        data=data.decode('utf-8')
    except:
        data=data.decode('gbk','ignore')
    return data
def postData(url,data):
    data=urllib.parse.urlencode(data);data=bytes(data,'utf-8')
    r=urllib.request.Request(url,data)
    opener=urllib.request.build_opener(chandle)
    u=opener.open(r)
    #chandle.cookiejar.save('f:/cookie.txt',True,True)
    data=u.read()
    try:
        data=data.decode('utf-8')
    except:
        data=data.decode('gbk','ignore')
    return data
"""火车票"""
class Ticket:
    def init(self,s,e,d):
        self.li=[]
        cont=getData('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js')
        s=re.findall('%s\|([^|]+)' % s,cont)[0]
        e=re.findall('%s\|([^|]+)' % e,cont)[0]
        url='https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=0X00&queryDate=%s&from_station=%s&to_station=%s' % (d,s,e)
        cont=json.loads(getData(url))["data"]["datas"]
        name=[
            "station_train_code",
            "from_station_name",
            "to_station_name",
            "lishi",
            "swz_num",
            "tz_num",
            "zy_num",
            "ze_num",
            "gr_num",
            "rw_num",
            "yw_num",
            "rz_num",
            "yz_num",
            "wz_num",
            "qt_num"
        ]
        for x in cont:
            tmp=[]
            for y in name:
                if y=="from_station_name":
                    s=x[y]+'\n'+x["start_time"]
                    tmp.append(s)
                elif y=="to_station_name":
                    s=x[y]+'\n'+x["arrive_time"]
                    tmp.append(s)
                else:
                    tmp.append(x[y])
            self.li.append(tmp)
"""ui"""
class Dialog(QDialog):
    ticket=Ticket()
    def __init__(self):
        super().__init__()
        self.resize(750,350)
        #布局管理器
        self.layout=[QVBoxLayout(self),QHBoxLayout()]
        self.layout[1].setContentsMargins(0,0,0,0)
        self.layout[1].setSpacing(0)
        self.layout[0].setContentsMargins(0,0,0,0)
        self.layout[0].setSpacing(0)
        self.layout[0].addLayout(self.layout[1])
        #按钮
        btn=QPushButton("ok")
        btn.clicked.connect(self.submit)
        #输入选项
        label=[QLabel("发站:"),QLabel("到站:"),QLabel("日期:")]
        self.line=[QLineEdit(),QLineEdit(),QComboBox()]
        y=int(time.strftime("%Y",time.localtime()))
        m=int(time.strftime("%m",time.localtime()))
        d=int(time.strftime("%d",time.localtime()))
        i=0
        yy=y
        mm=m
        dd=d
        while i<20:
            if m in (1,3,5,7,8,10,12):
                if d+i>31:
                    dd=d+i-31
                    mm=m+1
                    if mm>12:
                        yy=y+1
                        mm=mm-12
                else:
                    dd=d+i
            elif m in (4,6,9,11):
                if d+i>30:
                    dd=d+i-30
                    mm=m+1
                    if mm>12:
                        yy=y+1
                        mm=mm-12
                else:
                    dd=d+i
            else:
                if (m%400==0) or ((m%4==0) and (m%100!=0)):
                    if d+i>29:
                        dd=d+i-29
                        mm=m+1
                        if mm>12:
                            yy=y+1
                            mm=mm-12
                    else:
                        dd=d+i
                else:
                    if d+i>28:
                        dd=d+i-28
                        mm=m+1
                        if mm>12:
                            yy=y+1
                            mm=mm-12
                    else:
                        dd=d+i
            s='%d-%02d-%02d' % (yy,mm,dd)
            self.line[2].addItem(s)
            i+=1
        i=0
        while i<3:
            self.line[i].setMaximumWidth(100)
            label[i].setMaximumWidth(50)
            label[i].setAlignment(Qt.AlignRight|Qt.AlignVCenter)
            self.layout[1].addWidget(label[i],Qt.AlignRight)
            self.layout[1].addWidget(self.line[i],Qt.AlignLeft)
            i+=1
        self.layout[1].addWidget(btn)
        #表格
        head=['车次','发站','到站','历时','商务座','特等座','一等座','二等座','高级软卧','软卧','硬卧','软座','硬座','无座','其他']
        self.table=QTableWidget()
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.table.setColumnCount(15)
        self.table.setHorizontalHeaderLabels(head)
        self.layout[0].addWidget(self.table)
        self.show()
    def submit(self):
        self.table.clearContents()
        s=self.line[0].text()
        e=self.line[1].text()
        d=self.line[2].currentText()
        self.ticket.init(s,e,d)
        self.table.setRowCount(len(self.ticket.li))
        i=0
        for x in self.ticket.li:
            j=0
            for y in x:
                if j==1 or j==2:
                    item=QLabel(y)
                    item.setAlignment(Qt.AlignCenter)
                    self.table.setCellWidget(i,j,item)
                else:
                    item=QTableWidgetItem(y)
                    item.setTextAlignment(Qt.AlignCenter)
                    if not re.search('\D',y):
                        item.setForeground(QBrush(Qt.red))
                    self.table.setItem(i,j,item)
                if j>2 or j==0:
                    self.table.resizeColumnToContents(j)
                j+=1
            i+=1
if __name__=="__main__":
    app=QApplication(sys.argv)
    dialog=Dialog()
    sys.exit(app.exec_())
Python 相关文章推荐
Python遍历目录的4种方法实例介绍
Apr 13 Python
Python and、or以及and-or语法总结
Apr 14 Python
PyQt5每天必学之拖放事件
Aug 27 Python
Python实现的建造者模式示例
Aug 06 Python
python for循环输入一个矩阵的实例
Nov 14 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 Python
Python批量将图片灰度化的实现代码
Apr 11 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
Python map及filter函数使用方法解析
Aug 06 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
Python测试框架pytest高阶用法全面详解
Jun 01 Python
python抓取豆瓣图片并自动保存示例学习
Jan 10 #Python
python文件比较示例分享
Jan 10 #Python
python发送伪造的arp请求
Jan 09 #Python
python抓取京东价格分析京东商品价格走势
Jan 09 #Python
python实现电子词典
Apr 23 #Python
python中cPickle用法例子分享
Jan 03 #Python
使用python获取CPU和内存信息的思路与实现(linux系统)
Jan 03 #Python
You might like
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
基于jquery的loading效果实现代码
2010/11/05 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
python实现基本进制转换的方法
2015/07/11 Python
Python批量更改文件名的实现方法
2017/10/29 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
tensorflow 变长序列存储实例
2020/01/20 Python
Python能做什么
2020/06/02 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
竞聘书格式及范文
2014/03/31 职场文书
小学生期末评语
2014/04/21 职场文书
绿色出行口号
2014/06/18 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2015年重阳节主持词
2015/07/04 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python
python套接字socket通信
2022/04/01 Python