一、需要的模块
pip install splinter
二、下载浏览器的驱动(chrome或者火狐都可以)
chrome浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
Firefox浏览器驱动下载地址,请点击https://github.com/mozilla/geckodriver/releases
备注:
1、根据下载的自己的电脑系统选择下载包,我的windows就用win32了,这边我直接用的火狐的,因为chrome驱动太多了,我也不知道哪一个版本(建议从最新的一个个试)。
将下载好的驱动解压到PATH路径目录下,当然也可以给这个驱动程序弄个环境变量。
2、我这边通过爬虫将chrome所有的驱动版本已经下载好了,也有firefox驱动
https://pan.baidu.com/s/1bqUVvrx
三、测试
1、利用百度搜索一些东西
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from splinter.browser import Browser
#b = Browser(driver_name="chrome")
b = Browser(driver_name="firefox")
b.visit("http://www.baidu.com")
2、输入一些像搜索的内容
由上可以发现,该输入框的name=wd,通过fill似乎只能通过name填充
在输入框搜索 360,当然也可以输入中文,但是最好指定Unicode编码,如u”你好”
代码如下:
b.fill("wd","360")
但是,如果多次搜索,我们还是需要点击”百度一下”的
百度搜索栏的value=”百度一下”,id=”su”,所以需要把这个按钮提取出来
button = b.find_by_value(u"百度一下")
或者
button = b.find_by_id(u"su")
#点击
button.click()
我们找找页面里有没有我想找的东西吧,比如找找有没有这个地址”splinter.cobrateam.info”
b.is_text_present("splinter.cobrateam.info") #如果该页面存在,则返回True,反之亦然
b.quit() #退出
四、购票程序思路讲解
1、手动登陆,能通过下面的代码填充表单,但是我跳不过验证码,还是等手动选择验证码的。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from splinter.browser import Browser
url = "https://kyfw.12306.cn/otn/leftTicket/init"
#b = Browser(driver_name="chrome")
b = Browser(driver_name="firefox")
b.visit(url)
b.find_by_text(u"登录").click()
b.fill("loginUserDTO.user_name","xxxx")
b.fill("userDTO.password","xxxx")
2、第二部选择出发地点日期等
通过cookies选择出发地点,日期及目的地,这些数据需要自己去copy
3、添加出发地,出发日期,目的地
b.cookies.add({"_jc_save_fromStation":u"%u4E0A%u6D77%2CSHH"})
b.cookies.add({"_jc_save_fromDate":u"2018-02-08"})
b.cookies.add({u'_jc_save_toStation':u"%u77F3%u5BB6%u5E84%2CSJP"})
备注:如果是修改的话,还是调用add方法,如果传入的字典key值已存在则替换
比如,将目的地改为其他地方xxxx,如下即可
b.cookies.add({u’_jc_save_toStation’:’xxxxxx’})
4、查看现在的cookies值
{u'BIGipServerotn': u'1406730506.50210.0000',
u'JSESSIONID': u'4674AFC0B20A054C12A6F652093F31D6',
u'__NRF': u'95D48FC2E0E15920BFB61C7A330FF2AE',
u'_jc_save_fromDate': u'2018-02-08',
u'_jc_save_fromStation': u'%u4E0A%u6D77%2CSHH',
u'_jc_save_toStation': u'%u77F3%u5BB6%u5E84%2CSJP',
u'current_captcha_type': u'Z'}
5、cookies已经准备完毕,reload一下,开始查询
b.reload()
b.find_by_text(u"查询").click()
到这一步我们得确认的是,自己已经登录了。一切准备就绪了,就可以刷票了。
6、选择要预定的火车车次
从我自己坐的火车线路来看,一共11趟,我只想做高铁,那么我的预订在第9个,索引值为8。
b.find_by_text(u"预订")[8].click()
7、选择乘客
b.find_by_text(u"你的姓名")[1].click()
五、购买火车票完整代码
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from splinter.browser import Browser
from time import sleep
cookie_value = {
'上海':u"%u4E0A%u6D77%2CSHH",
'砀山':u"%u7800%u5C71%2CDKH",
'石家庄北':u"%u77F3%u5BB6%u5E84%2CSJP",
'广州':u'%u5E7F%u5DDE%2CGZQ',
'东莞东':u'%u4E1C%u839E%u4E1C%2CDMQ',
'营山':u'%u8425%u5C71%2CNUW'
}
class buy_ticket_proc(object):
driver_name = ''
executable_path = ''
#12306的账号和密码
username = "xxxxxxx"
passwd = "xxxxxxx"
# cookies值和乘车日期
starts = cookie_value['上海']
ends = cookie_value['石家庄北']
dtime = u"2018-02-08"
# 车次,选择第几趟,0则从上之下依次点击
#order = 0
order = [9,11]
###乘客名
users = [u"xxx",u"xxx"]
##席位
xb = u"二等座"
pz = u"成人票"
"""购票网址"""
login_url = "https://kyfw.12306.cn/otn/login/init"
ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
buy = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
def __init__(self):
self.driver_name = 'firefox'
self.executable_path = r'E:\Mysql\mysql-5.6\bin\geckodriver' #这个路径自己指定,只有系统可以找到即可
def login(self):
self.driver.visit(self.login_url)
self.driver.fill("loginUserDTO.user_name", self.username)
self.driver.fill("userDTO.password", self.passwd)
print("等待验证码,自行输入...")
while True:
if self.driver.url != self.initmy_url:
pass
else:
break
def start(self):
self.driver = Browser(driver_name=self.driver_name, executable_path=self.executable_path)
self.login()
self.driver.visit(self.ticket_url)
try:
print("购票页面开始...")
self.driver.cookies.add({"_jc_save_fromStation": self.starts})
self.driver.cookies.add({"_jc_save_toStation": self.ends})
self.driver.cookies.add({"_jc_save_fromDate": self.dtime})
self.driver.reload()
count = 0
if len(self.order) != 0:
while self.driver.url == self.ticket_url:
self.driver.find_by_text(u"查询").click()
count += 1
print("循环点击查询... 第 %s 次" % count)
sleep(1)
try:
for i in self.order:
self.driver.find_by_text(u"预订")[ i - 1].click()
except Exception as e:
print("还没开始预订")
continue
else:
while self.driver.url == self.ticket_url:
self.driver.find_by_text(u"查询").click()
count += 1
print("循环点击查询... 第 %s 次" % count)
try:
for i in self.driver.find_by_text(u"预订"):
i.click()
except Exception as e:
print("还没开始预订 %s" % count)
continue
print("开始预订...")
sleep(1)
print('开始选择用户...')
for user in self.users:
self.driver.find_by_text(user).last.click()
print("提交订单...")
self.driver.find_by_id('submitOrder_id').click()
print("确认选座...")
self.driver.find_by_id('qr_submit_id').click()
except Exception as e:
print(e)
if __name__ == '__main__':
ticket = buy_ticket_proc()
ticket.start()