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 re正则表达式模块(Regular Expression)
Jul 16 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
Python进阶之尾递归的用法实例
Jan 31 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
python实现扫描日志关键字的示例
Apr 28 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
Python序列化pickle模块使用详解
Mar 05 Python
Django REST 异常处理详解
Jul 15 Python
python 绘制场景热力图的示例
Sep 23 Python
关于python中readlines函数的参数hint的相关知识总结
Jun 24 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中的正规表达式(一)
2006/10/09 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
javascript 获取网页参数系统
2008/07/19 Javascript
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python 上下文管理器使用方法小结
2017/10/10 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
python 获取url中的参数列表实例
2018/12/18 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
营销专业应届生求职信
2013/11/26 职场文书
中专生自我鉴定范文
2013/12/19 职场文书
商务英语求职信范文
2015/03/19 职场文书
如何写好竞聘报告
2019/04/03 职场文书
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android