本文目录一览:
- 1、python 火车票查票的代码 其中 e=re.findall('%s\|([^|]+)' % e,cont)[0]
- 2、实验楼python实现火车票查询工具怎么在windows上运行
- 3、python爬虫12306获取是否有车票
- 4、python如何判断购买火车有没有对应的列车,没有就输出未查询到对应的车次?
- 5、Python 实现一个火车票查询的工具
- 6、python新手代码是什么?
python 火车票查票的代码 其中 e=re.findall('%s\|([^|]+)' % e,cont)[0]
'%s\|([^|]+)' % e
这是" 格式化字符串%参数 "的形式 '%s\|([^|]+)' 是用于格式化的字符串,%e e是参数
%s表示将e作为字符串打印 '\|([^|]+)' 于'|([^|]+')相同,如e 为hello,这个字符串就是
'hello|([^|]+)' 这就是实际传给findall的正则表达式,这样正则就不对吧
如果字符串前有r才对吧,e=re.findall(r'%s\|([^|]+)' % e,cont)[0] ,这样提取findall查找到的列表中下标为0的第一个值
实验楼python实现火车票查询工具怎么在windows上运行
把D:\python-2.7.3\加到path的环境变量里面就行,不要写成D:\python-2.7.3\python,我看你现在就写成了后面那个。因为你加到path里的应该是一个目录,然后你在命令行里面输入python的时候,它会自动到path变量里面的各个目录底下去找存不存在python.exe这个程序。所以你在path里面输入的应该是目录,也就是D:\python-2.7.3\就可以了。然后到hello.py在的目录底下,也就是D盘,执行pythonhello.py就行了。p.s.最简单在某一个目录底下打开命令行的方式是在“我的电脑”浏览那个目录的时候“shift+右击鼠标”,然后菜单里面有一个“在此处打开命令窗口”就行了。这样就不需要用cd去切换了。
python爬虫12306获取是否有车票
看看这个可以吗
功能:
1:全自动爬所有车站列表
2:爬所有车站之间的所有车次,过滤重复,保存文件
爬过程中保存文件
遇到http异常,停止继续
脚本代码
[python] view plaincopy
#coding:utf-8
__author__ = 'watsy'
from sgmllib import SGMLParser
import urllib
import urllib2
import datetime
import json
import os
from time import sleep
# 城市对象
class cityObject(object):
def __init__(self, abbr_pinyin="", full_pinyin="",chinaname="",shortCode=""):
self.abbr_pinyin = abbr_pinyin
self.full_piyin = full_pinyin
self.chinaname = chinaname
self.shortCode = shortCode
# 火车
class trainObject(object):
def __init__(self, tid="", code="", start_city="", start_time="", end_city="", end_time="", full_time=""):
self.tid = tid
self.code = code
self.start_city = start_city
self.start_time = start_time
self.end_city = end_city
self.end_time = end_time
self.full_time = full_time
def get_writestr(self):
# return ("%s,%s,%s,%s,%s,%s,%s") % (self.tid, self.code, self.start_city.encode('utf-8'), self.start_time, self.end_city.encode('utf-8'), self.end_time, self.full_time)
str_return = self.tid + ",";
str_return += self.code + ",";
str_return += self.start_city + ",";
str_return += self.start_time + ",";
str_return += self.end_city + ",";
str_return += self.end_time + ",";
str_return += self.full_time;
return str_return
# 火车列表
class trainModel(list):
def isExist(self, train):
for sub_train in self:
if sub_train.code == train.code:
return True
return False
def save(self):
train = self[-1]
with open(("%s.txt") % (train.code), "w") as wf:
print train.get_writestr()
wf.write(train.get_writestr().encode('utf-8'))
# 解析城市
def parserCitys(data):
parser_citys = []
for original_city in data:
if original_city and len(original_city) 1:
split_city = original_city.split('|')
parser_city = cityObject(split_city[0], split_city[3], split_city[1], split_city[2])
parser_citys.append(parser_city)
print len(parser_citys)
return parser_citys
# 生成url地址
def getBookingTrainListUrl(start_code, end_code, day):
strUrl = (";")
strUrl += ("orderRequest.train_date=%s") % (day)
strUrl += ("orderRequest.from_station_telecode=%s") % (start_code)
strUrl += ("orderRequest.to_station_telecode=%s") % (end_code)
strUrl += ("orderRequest.train_no=trainPassType=QBtrainClass=QB%23D%23Z%23T%23K%23QT%23includeStudent=00seatTypeAndNum=orderRequest.start_time_str=00%3A00--24%3A00")
return strUrl
trains = trainModel()
# 解析 预定车次列表
def parser_booking_str(str_booking):
json_book = json.loads(str_booking)
datas = json_book['datas']
if datas and len(datas) 1:
# print datas.replace(" ","")
trainlist = datas.replace(" ","").split("\\n")
for train_str in trainlist:
train_str_list = train_str.split(',')
if len(train_str_list) == 17:
str_id_and_code = train_str_list[1]
str_start_city_and_time = train_str_list[2]
str_end_city_and_time = train_str_list[3]
str_full_time = train_str_list[4]
# print str_id_and_code
str_id = str_id_and_code[13:25]
str_code = str_id_and_code[131:-7]
# print str_start_city_and_time
if len(str_start_city_and_time) 50:
str_start_city = str_start_city_and_time[43:-9]
else :
str_start_city = str_start_city_and_time[0:-9]
str_start_time = str_start_city_and_time[-5:]
# print str_end_city_and_time
if len(str_end_city_and_time) 50:
str_end_city = str_end_city_and_time[42:-9]
else:
str_end_city = str_end_city_and_time[0:-9]
str_end_time = str_end_city_and_time[-5:]
tobj = trainObject(str_id, str_code, str_start_city, str_start_time, str_end_city, str_end_time, str_full_time)
if trains.isExist(tobj) == False:
trains.append(tobj)
trains.save()
#打开城市列表页面
u = urllib2.urlopen("")
buffer = u .read()
u.close()
#获取列表
buffer = buffer[20:-3]
unformatter_citys = buffer.split('@')
#得到城市
parser_citys = parserCitys(unformatter_citys)
city_length = len(parser_citys)
today = datetime.date.today()
torrow = datetime.timedelta(days=1)
today = today + torrow
day_str = ("%s-%02d-%02d") % (today.year, int(today.month), int(today.day))
print (day_str)
strPath = os.getcwd()
os.chdir("%s/train/" % strPath)
for i in range(1, city_length):
for j in range(0 , len(parser_citys) - i):
try:
print ("[%d %d]" % (i , j))
sleep(0.09)
strurl = getBookingTrainListUrl(parser_citys[i].shortCode, parser_citys[j].shortCode, day_str)
url_add_header = urllib2.Request(strurl)
url_add_header.add_header('X-Requested-With', "XMLHttpRequest")
url_add_header.add_header('Referer', "")
url_add_header.add_header('Content-Type', 'application/x-www-form-urlencoded')
url_add_header.add_header('Connection', 'keep-alive')
resp = urllib2.urlopen(url_add_header)
urlread = resp.read()
resp.close()
parser_booking_str(urlread)
except urllib2.HTTPError as err:
print ("error : [%s] url=[%s]") % (err, strurl)
exit(1)
os.chdir(strPath)
print len(trains)
python如何判断购买火车有没有对应的列车,没有就输出未查询到对应的车次?
登录一下你购买的这一个车次之后,如果你确定成功的话,肯定就是已经购买成功,或者是你重新再购买一下,看一下是否可以下单不付款。
Python 实现一个火车票查询的工具
使用 python 实现一个查询火车票的小工具
主要功能:
输入出发车站,到达车站,时间,然后返回所有的车次信息,和余票信息
支持输入附加选项查询不同的火车的类型,比如高铁,动车。
#查询上海到北京2017-04-25的高铁和动车的车票,-g -d 是附加选项 表示高铁和动车
python3 trains.py -gd 上海 北京 2017-04-25
运行结果:
1. 对12306网站买票过程抓包分析
点击查询之后,通过抓包发现返回了一个json的文件,查看这个文件,就是保存着具体车次的信息。抓包如下图所示。
请求的url 是:
GET /otn/leftTicket/query?leftTicketDTO.train_date=2017-04-20leftTicketDTO.from_station=TJPleftTicketDTO.to_station=TYVpurpose_codes=ADULT HTTP/1.1
发现这个请求使用的是get方法,然后传递了四个参数,一个是出发站,一个是到达车站,一个是成年人or学生,最后一个是时间。如下图:
但是有一个问题是,我输入的是天津到太原,但是这个却转换成了拼音的简称。必须要找到这个转换的字典是什么,这样才能正确的使用这个接口。
在网页的源代码找到这个文件,station_name.js 文件,如下图:
js文件的格式是,如下图,使用的话,必须要想用正则表达式处理一下:
2. 使用正则表达式处理这个js文件
使用正则表达式,将js 文件里面的车站名字和对应的简称提取出来,然后写入到一个station.py 文件里面,作为字典,程序运行的时候,将这个文件以模块的形式包含进去。
关于正则表达式,先占一个坑,以后在详细的写。
正则表达式的代码:
运行的时候:
# 将输出重定向到一个新的文件stations.py里面python3 test3.py stations.py
3. 使用docopt 优雅的完成命令行的输入
docopt 是一个很优雅的处理输入的一个模块,docopt可以根据你写的文档描述,可以自动为你生成解析器,可以非常容易的为你的python程序创建命令行界面。
4. 主程序
4.1 处理url
4.2 输出
运行结果:
5. 使用prettytable模块 优雅的输出
详细:
作者 sexycoder 本文转载自简书,转载需授权
python新手代码是什么?
python新手代码是:
1、shuizitiqu.py——————数字提取。
2、socker_ping.py——————长ping 检测网络状态。
3、spider_tieba.py——————爬取百度贴吧图片。
4、tianqi.py——————微信自动回复天气。
5、ticket_searchTrain.py——————12306火车票查询。
6、ticket_stations.py——————12306火车站点。
7、txt.py——————txt文件抽取。
8、weixinhuifu.py——————微信自动回复天气。
9、xlsfile.py——————xls文件提取。