python12306
1. 如何用python写一个简单的12306抢票软件
看看这个可以吗功能:1:全自动爬所有车站列表2:爬所有车站之间的所有车次,过滤重复,保存文件爬过程中保存文件遇到http异常,停止继续脚本代码[python]viewplain#coding:utf-8__author__='watsy'#城市对象classcityObject(object):def__init__(self,abbr_pinyin="",full_pinyin="",chinaname="",shortCode=""):self.abbr_pinyin=abbr_pinyinself.full_piyin=full_pinyinself.chinaname=chinanameself.shortCode=shortCode#火车classtrainObject(object):def__init__(self,tid="",code="",start_city="",start_time="",end_city="",end_time="",full_time=""):self.tid=tidself.code=codeself.start_city=start_cityself.start_time=start_timeself.end_city=end_cityself.end_time=end_timeself.full_time=full_timedefget_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;returnstr_return#火车列表classtrainModel(list):defisExist(self,train):forsub_traininself:ifsub_train.code==train.code:returnTruereturnFalsedefsave(self):train=self[-1]withopen(("%s.txt")%(train.code),"w")aswf:printtrain.get_writestr()wf.write(train.get_writestr().encode('utf-8'))#解析城市defparserCitys(data):parser_citys=[]fororiginal_cityindata:iforiginal_cityandlen(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)printlen(parser_citys)returnparser_citys#生成url地址defgetBookingTrainListUrl(start_code,end_code,day):strUrl=("/otsquery/query/queryRemanentTicketAction.do?method=queryLeftTicket&")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=QB&trainClass=QB%23D%23Z%23T%23K%23QT%23&includeStudent=00&seatTypeAndNum=&orderRequest.start_time_str=00%3A00--24%3A00")returnstrUrltrains=trainModel()#解析预定车次列表defparser_booking_str(str_booking):json_book=json.loads(str_booking)datas=json_book['datas']ifdatasandlen(datas)>1:#printdatas.replace("","")trainlist=datas.replace("","").split("\\n")fortrain_strintrainlist:train_str_list=train_str.split(',')iflen(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]#printstr_id_and_codestr_id=str_id_and_code[13:25]str_code=str_id_and_code[131:-7]#printstr_start_city_and_timeiflen(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:]#printstr_end_city_and_timeiflen(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)iftrains.isExist(tobj)==False:trains.append(tobj)trains.save()#打开城市列表页面u=urllib2.urlopen("mon/station_name.js?version=1.40")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+torrowday_str=("%s-%02d-%02d")%(today.year,int(today.month),int(today.day))print(day_str)strPath=os.getcwd()os.chdir("%s/train/"%strPath)foriinrange(1,city_length):forjinrange(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',"/otsquery/query/queryRemanentTicketAction.do?method=init")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)excepturllib2.HTTPErroraserr:print("error:[%s]url=[%s]")%(err,strurl)exit(1)os.chdir(strPath)printlen(trains)
2. 如何python12306的城市代码
给你个我之前写的参考 import re; import sys; import cookielib; import urllib; import urllib2; import optparse; import json; import httplib2; #reload(sys) #sys.setdefaultencoding('utf8'); def Login(): cj = cookielib.CookieJar(); ...
3. 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-20&leftTicketDTO.from_station=TJP&leftTicketDTO.to_station=TYV&purpose_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程序创建命令行界面。http://www.jianshu.com/p/d2c7cbf21931
4. 主程序
4.1 处理url
4.2 输出
运行结果:
5. 使用prettytable模块 优雅的输出
详细:http://www.jianshu.com/p/a6172b68810e
作者 sexycoder 本文转载自简书,转载需授权
4. 如何用python写一个简单的12306抢票软件
3
你自己的问题都不详细,别人怎么会给你详细的答案。 抢票软件一般也就是模拟浏览器发请求,当然纯粹模拟也会有很多问题,比如验证码,请求数等等,具体看你要实现什么效果。
5. 我写了个python读取12306网页的脚本本地运行良好,一旦提交到GAE就报错
在python中,一般我们使用urllib的urlopen来打开一个URL并抓取网页内容或者服务器的返回数据 ! 但是在GAE中不能这样做,否则会报“访问被拒绝”字样的错误,主要原因是python中的urlopen使用了socket来连接
6. python 实现12306模拟浏览器登录 手动输入验证码 怎么输入
代码中验证码提供有两种方式,第一种通过webbrowser的open直接在浏览器中打开含有验证码的图片,第二种就是将其以jepg格式存在C:\\Users\\Administrator\\Desktop\\checkcode.jepg。你可以根据自己主机的用户名更改路径。同时这个代码必须先指定用户名和账号也可以实时输入账号的密码,小小修改一下代码就可以。
7. python 如果抓取验证码图片 类似12306的登录验证码图片
这个以前做过多次。最大的麻烦是验证码的识别算法的识别率太低。比如12306那种网站你登陆错3次就限制你20分钟。所以除非你有33%以上的识别率否则不要尝试了。
通常做法是另存验证码图片,通常收集几十个,然后训练自己的识别算法。我曾经用PIL库自己做过识别算法,最高只有10%的识别率。效率还可以,一秒可以识别10次左右。主要是图片很小,所以处理起来也快。
验证码识别还有多少公开的算法,只能用来参考。不过真正识别都需要自己根据实际情况去训练改进算法。
8. python模拟登陆12306,该怎么处理
给你个我之前写的参考
import re;
import sys;
import cookielib;
import urllib;
import urllib2;
import optparse;
import json;
import httplib2;
#reload(sys)
#sys.setdefaultencoding('utf8');
def Login():
cj = cookielib.CookieJar();
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
urllib2.install_opener(opener);
Url = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?mole=login&rand=sjrand";
resp = urllib2.urlopen(Url);
with open("code.png", "wb") as image:
image.write(resp.read())
codeStr = sys.stdin.readline();
codeStr = codeStr[:-1]
ajax_url = "https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn";
dc = {
'randCode' : codeStr,
'rand' : "sjrand"
};
request = urllib2.Request(ajax_url, urllib.urlencode(dc))
request.add_header("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
request.add_header('X-Requested-With','XMLHttpRequest')
request.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
request.add_header('Referer','https://kyfw.12306.cn/otn/login/init')
request.add_header('Accept','*/*')
request.add_header('Accept-Encoding','gzip, deflate')
f = urllib2.urlopen(request)
print(f.read())
LoginUrl = "https://kyfw.12306.cn/otn/login/loginAysnSuggest";
dc = {
'randCode' : codeStr,
'userDTO.password' : "你的密码",
'loginUserDTO.user_name': "你的账号"
};
PS:运行出错的话按照报错稍微调整一下,应该没问题,之前我用来查票的。
9. 我从github上下载了python12306的抢票程序,但运行时一堆错误,求各位大神帮帮忙哈
贴一下具体链接呢
还有github上的代码,一般star至少要几十个的,才有一定质量保证
10. Python3爬12306怎么提交预定也就是下单
最难得是识别验证码,把识别验证码先搞定再说吧