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之用while来循环
Oct 02 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
python 字符串常用方法汇总详解
Sep 16 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
asyncio异步编程之Task对象详解
Mar 13 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像数组一样存取和修改字符串字符
2014/03/21 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
超级退弹代码
2008/07/07 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
vue时间格式化实例代码
2017/06/13 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
python映射列表实例分析
2015/01/26 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
java关于string最常出现的面试题整理
2021/01/18 Python
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
办公室主任岗位职责
2013/11/08 职场文书
求职意向书
2014/04/01 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
人力资源部岗位职责
2015/02/11 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
学校推普周活动总结
2015/05/07 职场文书
同事离别感言
2015/08/04 职场文书
Android 中的类文件和类加载器详情
2022/06/05 Java/Android