前段时间买火车票老是需要让携程给我弄什么加速包来抢票,于是就想着自己弄一个抢票的小程序。刚开始本来也没打算用selenium来做,因为这个部署到服务器很麻烦,所以想着用requests+js2py来做,尝试了一下后发现从登陆到订票一系列的参数和跳转太多了,分析得我脑壳痛,于是不得已还是用了selenium+chromedriver,不得不说,嗯,真香!
我先说一下我的思路吧:
1、首先抛开登陆这个先不谈,先把简单的事儿做了。先尝试查询一下火车余票信息,这个其实可以用requests很简单的就能爬下来。当有余票信息后立马调用selenium。
2、对于selenium这部分来说主要是解决登录和订票问题,登录所需的验证码还是需要去找到地址爬取下来,然后人为去识别然后再在页面上获取其(x,y)值然后发送点击事件。这样是比较麻烦的一种做法,我想到一个简单的,就是用代码中实现在selenium上一次登录后记录下cookie值,写进文件里面,下次再需要的时候直接读取cookie值发送过去就行了。
3、订票的过程没什么好说的,按照页面点击就行。
4、最后由于订到票之后会有30分钟的付款时间,所以可以做一个邮件提醒功能,或是手机短信提醒,这样就能及时的付款了,还能调用微信的接口,给自己发条微信,也是可以的。
具体先看查询余票,12306有自己的一长串城市和城市代码的map,就是下面这个,我写了一个方法,方便返回城市名或城市代码。
station_map = '@bjb|北京北|VAP|beijingbei|bjb|0@bjd|北京东|BOP|beijingdong|bjd|1@bji|北京|BJP|beijing|bj|2@bjn|'
def get_city_or_citycode(city):
for i in station_map.split( '@'):
if i:
tmp = i.split( '|')
if city == tmp[1]:
return tmp[2]
elif city==tmp[2]:
return tmp[1]
return False
然后就可以发送请求了
import requests,json
from city_map import get_city_or_citycode
headers={
'Accept':'*/*',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cache-Control':'no-cache',
'Connection':'keep-alive',
'Host':'kyfw.12306.cn',
'If-Modified-Since':'0',
'Referer':'https://kyfw.12306.cn/otn/leftTicket/init',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
}
def query_ticker(riqi="2018-12-31",from_sta='北京',to_sta="上海"):
from_sta=get_city_or_citycode(from_sta)
to_sta=get_city_or_cityco