免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3515 | 回复: 3

火车票查询(python版) [复制链接]

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-06-26 22:20:00每日论坛发贴之星
日期:2015-06-26 22:20:00
发表于 2015-07-08 14:24 |显示全部楼层
基于Python3.3.3,PyQt5.1.1

[Python]代码
  1. # -*- coding: utf-8 -*-
  2. # Python 3.3.3
  3. # PyQt 5.1.1
  4. import sys,time,re,urllib.parse,urllib.request,http.cookiejar,json
  5. from PyQt5.QtCore import *
  6. from PyQt5.QtGui import *
  7. from PyQt5.QtWidgets import *

  8. """cookie"""
  9. cookie=http.cookiejar.LWPCookieJar()
  10. #cookie.load('f:/cookie.txt',True,True)
  11. chandle=urllib.request.HTTPCookieProcessor(cookie)

  12. """获取数据"""
  13. def getData(url):
  14.     r=urllib.request.Request(url)
  15.     opener=urllib.request.build_opener(chandle)
  16.     u=opener.open(r)
  17.     #chandle.cookiejar.save('f:/cookie.txt',True,True)
  18.     data=u.read()
  19.     try:
  20.         data=data.decode('utf-8')
  21.     except:
  22.         data=data.decode('gbk','ignore')
  23.     return data
  24. def postData(url,data):
  25.     data=urllib.parse.urlencode(data);data=bytes(data,'utf-8')
  26.     r=urllib.request.Request(url,data)
  27.     opener=urllib.request.build_opener(chandle)
  28.     u=opener.open(r)
  29.     #chandle.cookiejar.save('f:/cookie.txt',True,True)
  30.     data=u.read()
  31.     try:
  32.         data=data.decode('utf-8')
  33.     except:
  34.         data=data.decode('gbk','ignore')
  35.     return data
  36. """火车票"""
  37. class Ticket:
  38.     def init(self,s,e,d):
  39.         self.li=[]
  40.         cont=getData('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js')
  41.         s=re.findall('%s\|([^|]+)' % s,cont)[0]
  42.         e=re.findall('%s\|([^|]+)' % e,cont)[0]
  43.         url='https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=0X00&queryDate=%s&from_station=%s&to_station=%s' % (d,s,e)
  44.         cont=json.loads(getData(url))["data"]["datas"]
  45.         name=[
  46.             "station_train_code",
  47.             "from_station_name",
  48.             "to_station_name",
  49.             "lishi",
  50.             "swz_num",
  51.             "tz_num",
  52.             "zy_num",
  53.             "ze_num",
  54.             "gr_num",
  55.             "rw_num",
  56.             "yw_num",
  57.             "rz_num",
  58.             "yz_num",
  59.             "wz_num",
  60.             "qt_num"
  61.         ]
  62.         for x in cont:
  63.             tmp=[]
  64.             for y in name:
  65.                 if y=="from_station_name":
  66.                     s=x[y]+'\n'+x["start_time"]
  67.                     tmp.append(s)
  68.                 elif y=="to_station_name":
  69.                     s=x[y]+'\n'+x["arrive_time"]
  70.                     tmp.append(s)
  71.                 else:
  72.                     tmp.append(x[y])
  73.             self.li.append(tmp)
  74. """ui"""
  75. class Dialog(QDialog):
  76.     ticket=Ticket()
  77.     def __init__(self):
  78.         super().__init__()
  79.         self.resize(750,350)
  80.         #布局管理器
  81.         self.layout=[QVBoxLayout(self),QHBoxLayout()]
  82.         self.layout[1].setContentsMargins(0,0,0,0)
  83.         self.layout[1].setSpacing(0)
  84.         self.layout[0].setContentsMargins(0,0,0,0)
  85.         self.layout[0].setSpacing(0)
  86.         self.layout[0].addLayout(self.layout[1])
  87.         #按钮
  88.         btn=QPushButton("ok")
  89.         btn.clicked.connect(self.submit)
  90.         #输入选项
  91.         label=[QLabel("发站:"),QLabel("到站:"),QLabel("日期:")]
  92.         self.line=[QLineEdit(),QLineEdit(),QComboBox()]
  93.         y=int(time.strftime("%Y",time.localtime()))
  94.         m=int(time.strftime("%m",time.localtime()))
  95.         d=int(time.strftime("%d",time.localtime()))
  96.         i=0
  97.         yy=y
  98.         mm=m
  99.         dd=d
  100.         while i<20:
  101.             if m in (1,3,5,7,8,10,12):
  102.                 if d+i>31:
  103.                     dd=d+i-31
  104.                     mm=m+1
  105.                     if mm>12:
  106.                         yy=y+1
  107.                         mm=mm-12
  108.                 else:
  109.                     dd=d+i
  110.             elif m in (4,6,9,11):
  111.                 if d+i>30:
  112.                     dd=d+i-30
  113.                     mm=m+1
  114.                     if mm>12:
  115.                         yy=y+1
  116.                         mm=mm-12
  117.                 else:
  118.                     dd=d+i
  119.             else:
  120.                 if (m%400==0) or ((m%4==0) and (m%100!=0)):
  121.                     if d+i>29:
  122.                         dd=d+i-29
  123.                         mm=m+1
  124.                         if mm>12:
  125.                             yy=y+1
  126.                             mm=mm-12
  127.                     else:
  128.                         dd=d+i
  129.                 else:
  130.                     if d+i>28:
  131.                         dd=d+i-28
  132.                         mm=m+1
  133.                         if mm>12:
  134.                             yy=y+1
  135.                             mm=mm-12
  136.                     else:
  137.                         dd=d+i
  138.             s='%d-%02d-%02d' % (yy,mm,dd)
  139.             self.line[2].addItem(s)
  140.             i+=1
  141.         i=0
  142.         while i<3:
  143.             self.line[i].setMaximumWidth(100)
  144.             label[i].setMaximumWidth(50)
  145.             label[i].setAlignment(Qt.AlignRight|Qt.AlignVCenter)
  146.             self.layout[1].addWidget(label[i],Qt.AlignRight)
  147.             self.layout[1].addWidget(self.line[i],Qt.AlignLeft)
  148.             i+=1
  149.         self.layout[1].addWidget(btn)
  150.         #表格
  151.         head=['车次','发站','到站','历时','商务座','特等座','一等座','二等座','高级软卧','软卧','硬卧','软座','硬座','无座','其他']
  152.         self.table=QTableWidget()
  153.         self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
  154.         self.table.setColumnCount(15)
  155.         self.table.setHorizontalHeaderLabels(head)
  156.         self.layout[0].addWidget(self.table)
  157.         self.show()
  158.     def submit(self):
  159.         self.table.clearContents()
  160.         s=self.line[0].text()
  161.         e=self.line[1].text()
  162.         d=self.line[2].currentText()
  163.         self.ticket.init(s,e,d)
  164.         self.table.setRowCount(len(self.ticket.li))
  165.         i=0
  166.         for x in self.ticket.li:
  167.             j=0
  168.             for y in x:
  169.                 if j==1 or j==2:
  170.                     item=QLabel(y)
  171.                     item.setAlignment(Qt.AlignCenter)
  172.                     self.table.setCellWidget(i,j,item)
  173.                 else:
  174.                     item=QTableWidgetItem(y)
  175.                     item.setTextAlignment(Qt.AlignCenter)
  176.                     if not re.search('\D',y):
  177.                         item.setForeground(QBrush(Qt.red))
  178.                     self.table.setItem(i,j,item)
  179.                 if j>2 or j==0:
  180.                     self.table.resizeColumnToContents(j)
  181.                 j+=1
  182.             i+=1
  183. if __name__=="__main__":
  184.     app=QApplication(sys.argv)
  185.     dialog=Dialog()
  186.     sys.exit(app.exec_())
复制代码
1.jpg
ticket.py
  1. # -*- coding: utf-8 -*-
  2. # Python 3.3.3
  3. # PyQt 5.1.1
  4. import sys,time,re,urllib.parse,urllib.request,http.cookiejar,json
  5. from PyQt5.QtCore import *
  6. from PyQt5.QtGui import *
  7. from PyQt5.QtWidgets import *

  8. """cookie"""
  9. cookie=http.cookiejar.LWPCookieJar()
  10. #cookie.load('f:/cookie.txt',True,True)
  11. chandle=urllib.request.HTTPCookieProcessor(cookie)

  12. """获取数据"""
  13. def getData(url):
  14.     r=urllib.request.Request(url)
  15.     opener=urllib.request.build_opener(chandle)
  16.     u=opener.open(r)
  17.     #chandle.cookiejar.save('f:/cookie.txt',True,True)
  18.     data=u.read()
  19.     try:
  20.         data=data.decode('utf-8')
  21.     except:
  22.         data=data.decode('gbk','ignore')
  23.     return data
  24. def postData(url,data):
  25.     data=urllib.parse.urlencode(data);data=bytes(data,'utf-8')
  26.     r=urllib.request.Request(url,data)
  27.     opener=urllib.request.build_opener(chandle)
  28.     u=opener.open(r)
  29.     #chandle.cookiejar.save('f:/cookie.txt',True,True)
  30.     data=u.read()
  31.     try:
  32.         data=data.decode('utf-8')
  33.     except:
  34.         data=data.decode('gbk','ignore')
  35.     return data
  36. """火车票"""
  37. class Ticket:
  38.     def init(self,s,e,d):
  39.         self.li=[]
  40.         cont=getData('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js')
  41.         s=re.findall('%s\|([^|]+)' % s,cont)[0]
  42.         e=re.findall('%s\|([^|]+)' % e,cont)[0]
  43.         url='https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=0X00&queryDate=%s&from_station=%s&to_station=%s' % (d,s,e)
  44.         cont=json.loads(getData(url))["data"]["datas"]
  45.         name=[
  46.             "station_train_code",
  47.             "from_station_name",
  48.             "to_station_name",
  49.             "lishi",
  50.             "swz_num",
  51.             "tz_num",
  52.             "zy_num",
  53.             "ze_num",
  54.             "gr_num",
  55.             "rw_num",
  56.             "yw_num",
  57.             "rz_num",
  58.             "yz_num",
  59.             "wz_num",
  60.             "qt_num"
  61.         ]
  62.         for x in cont:
  63.             tmp=[]
  64.             for y in name:
  65.                 if y=="from_station_name":
  66.                     s=x[y]+'\n'+x["start_time"]
  67.                     tmp.append(s)
  68.                 elif y=="to_station_name":
  69.                     s=x[y]+'\n'+x["arrive_time"]
  70.                     tmp.append(s)
  71.                 else:
  72.                     tmp.append(x[y])
  73.             self.li.append(tmp)
  74. """ui"""
  75. class Dialog(QDialog):
  76.     ticket=Ticket()
  77.     def __init__(self):
  78.         super().__init__()
  79.         self.resize(750,350)
  80.         #布局管理器
  81.         self.layout=[QVBoxLayout(self),QHBoxLayout()]
  82.         self.layout[1].setContentsMargins(0,0,0,0)
  83.         self.layout[1].setSpacing(0)
  84.         self.layout[0].setContentsMargins(0,0,0,0)
  85.         self.layout[0].setSpacing(0)
  86.         self.layout[0].addLayout(self.layout[1])
  87.         #按钮
  88.         btn=QPushButton("ok")
  89.         btn.clicked.connect(self.submit)
  90.         #输入选项
  91.         label=[QLabel("发站:"),QLabel("到站:"),QLabel("日期:")]
  92.         self.line=[QLineEdit(),QLineEdit(),QComboBox()]
  93.         y=int(time.strftime("%Y",time.localtime()))
  94.         m=int(time.strftime("%m",time.localtime()))
  95.         d=int(time.strftime("%d",time.localtime()))
  96.         i=0
  97.         yy=y
  98.         mm=m
  99.         dd=d
  100.         while i<20:
  101.             if m in (1,3,5,7,8,10,12):
  102.                 if d+i>31:
  103.                     dd=d+i-31
  104.                     mm=m+1
  105.                     if mm>12:
  106.                         yy=y+1
  107.                         mm=mm-12
  108.                 else:
  109.                     dd=d+i
  110.             elif m in (4,6,9,11):
  111.                 if d+i>30:
  112.                     dd=d+i-30
  113.                     mm=m+1
  114.                     if mm>12:
  115.                         yy=y+1
  116.                         mm=mm-12
  117.                 else:
  118.                     dd=d+i
  119.             else:
  120.                 if (m%400==0) or ((m%4==0) and (m%100!=0)):
  121.                     if d+i>29:
  122.                         dd=d+i-29
  123.                         mm=m+1
  124.                         if mm>12:
  125.                             yy=y+1
  126.                             mm=mm-12
  127.                     else:
  128.                         dd=d+i
  129.                 else:
  130.                     if d+i>28:
  131.                         dd=d+i-28
  132.                         mm=m+1
  133.                         if mm>12:
  134.                             yy=y+1
  135.                             mm=mm-12
  136.                     else:
  137.                         dd=d+i
  138.             s='%d-%02d-%02d' % (yy,mm,dd)
  139.             self.line[2].addItem(s)
  140.             i+=1
  141.         i=0
  142.         while i<3:
  143.             self.line[i].setMaximumWidth(100)
  144.             label[i].setMaximumWidth(50)
  145.             label[i].setAlignment(Qt.AlignRight|Qt.AlignVCenter)
  146.             self.layout[1].addWidget(label[i],Qt.AlignRight)
  147.             self.layout[1].addWidget(self.line[i],Qt.AlignLeft)
  148.             i+=1
  149.         self.layout[1].addWidget(btn)
  150.         #表格
  151.         head=['车次','发站','到站','历时','商务座','特等座','一等座','二等座','高级软卧','软卧','硬卧','软座','硬座','无座','其他']
  152.         self.table=QTableWidget()
  153.         self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
  154.         self.table.setColumnCount(15)
  155.         self.table.setHorizontalHeaderLabels(head)
  156.         self.layout[0].addWidget(self.table)
  157.         self.show()
  158.     def submit(self):
  159.         self.table.clearContents()
  160.         s=self.line[0].text()
  161.         e=self.line[1].text()
  162.         d=self.line[2].currentText()
  163.         self.ticket.init(s,e,d)
  164.         self.table.setRowCount(len(self.ticket.li))
  165.         i=0
  166.         for x in self.ticket.li:
  167.             j=0
  168.             for y in x:
  169.                 if j==1 or j==2:
  170.                     item=QLabel(y)
  171.                     item.setAlignment(Qt.AlignCenter)
  172.                     self.table.setCellWidget(i,j,item)
  173.                 else:
  174.                     item=QTableWidgetItem(y)
  175.                     item.setTextAlignment(Qt.AlignCenter)
  176.                     if not re.search('\D',y):
  177.                         item.setForeground(QBrush(Qt.red))
  178.                     self.table.setItem(i,j,item)
  179.                 if j>2 or j==0:
  180.                     self.table.resizeColumnToContents(j)
  181.                 j+=1
  182.             i+=1
  183. if __name__=="__main__":
  184.     app=QApplication(sys.argv)
  185.     dialog=Dialog()
  186.     sys.exit(app.exec_())
复制代码

论坛徽章:
0
发表于 2015-07-09 10:58 |显示全部楼层
mark,学习了。

论坛徽章:
2
IT运维版块每日发帖之星
日期:2015-06-26 22:20:00IT运维版块每日发帖之星
日期:2015-06-29 22:20:00
发表于 2015-07-14 18:12 |显示全部楼层
不错的代码

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2015-07-14 19:47 |显示全部楼层
不错的代码 mark了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP