学了一学期Python还是让我感受到这是一门强大的语言,如果能熟练使用许多库的话,它给人带来的方便是非常大的,
很难想象一位Freelancer当初单枪匹马搞出来的语言,如今能发展壮大到这个程度!
本着服务生活的态度为Python的期末大作业做了一个能够查询连续多日内某地到某地的票源情况的查票器,
由于是脚本跳过了浏览器的限制,直接用URL(Universal Resource Locator)向12306服务器索取票池信息,
并且支持多日查询,在票源紧俏时能省下一些花在查询上的时间。
当然,系统这一关还得过,由于缺省状态下12306的根证书是不受系统信任的,使用本脚本前需要先将系统环境设置为信任12306的根证书,不然系统防火墙会自动拦下12306反馈的json包导致无法解析(当然如果不这样做,就是用浏览器上12306也可能出问题的)
参照http://jingyan.baidu.com/article/ce436649e4aa5d3772afd367.html这个上面说的做就行
弄完打开后的图形界面很直观,使用起来应该没问题...
p.s. 其实在查手册的时候还偶然发现存在scrapy这样比urllib更优秀的库可以用来写爬虫,还有PyQt5这样更加美观的GUI模块,这个程序算是对爬虫的一个入门吧,如果以后想写更高级的爬虫,最好还是先学习其他第三方库吧,要学的东西还多着那。
很难想象一位Freelancer当初单枪匹马搞出来的语言,如今能发展壮大到这个程度!
本着服务生活的态度为Python的期末大作业做了一个能够查询连续多日内某地到某地的票源情况的查票器,
由于是脚本跳过了浏览器的限制,直接用URL(Universal Resource Locator)向12306服务器索取票池信息,
并且支持多日查询,在票源紧俏时能省下一些花在查询上的时间。
当然,系统这一关还得过,由于缺省状态下12306的根证书是不受系统信任的,使用本脚本前需要先将系统环境设置为信任12306的根证书,不然系统防火墙会自动拦下12306反馈的json包导致无法解析(当然如果不这样做,就是用浏览器上12306也可能出问题的)
参照http://jingyan.baidu.com/article/ce436649e4aa5d3772afd367.html这个上面说的做就行
弄完打开后的图形界面很直观,使用起来应该没问题...
p.s. 其实在查手册的时候还偶然发现存在scrapy这样比urllib更优秀的库可以用来写爬虫,还有PyQt5这样更加美观的GUI模块,这个程序算是对爬虫的一个入门吧,如果以后想写更高级的爬虫,最好还是先学习其他第三方库吧,要学的东西还多着那。
import urllib.request,json,re,time #urllib用于抓包 json用于解析 re用于匹配车站名称 time用于获取本地时间
import tkinter as tk #用于基本的gui窗口
import tkinter.ttk as ttk #用于需求美观的gui widgets
#使用本程序前请先将系统环境设置为信任12306的根证书,以保证12306返回的json不会被系统拦截
def getStationNames(from_station,to_station): #获取车站名称信息,输入为汉字,输出为12306可读的标识符
url='https://kyfw.12306.cn/otn/resources/js/framework/station_name.js' #需要抓取的包来自这个URL
req=urllib.request.Request(url) #建立请求对象
response=urllib.request.urlopen(req) #发送请求并获取服务器的反馈
data=response.read() #读取反馈信息,其中记录了汉字与车站标识符的对应关系
try:
data=data.decode('utf-8') #尝试解码 首先使用utf-8格式
except:
data=data.decode('gbk','ignore') #失败则强制使用汉字编码模式
from_station=re.findall('%s\|([^|]+)' % from_station,data)[0] #正则匹配发站标识符
to_station=re.findall('%s\|([^|]+)' % to_station,data)[0] #正则匹配到站标识符
return from_station,to_station #返回匹配结果
class TicketPool: #这个类记录了“某一日某车次从某地到某地”的票池
def __init__(self):
self.station_train_code='' #列车号
self.start_train_date='' #发车日期
self.from_station_name='' #出发站
self.to_station_name='' #目的站
self.lishi='' #历时
self.start_time='' #开始时间
self.arrive_time='' #到达时间
self.swz_num='' #商务座数
self.tz_num='' #特等座数
s