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

1161次阅读  |  发布于5年以前

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

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8