当前位置 博文首页 > python实现2014火车票查询代码分享

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

    作者:admin 时间:2021-06-13 17:45

    代码基于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_())

    js
    下一篇:没有了