今天又没买到回家的火车票......
我表示很闹心,最近正好在研究知乎助手的那个小爬虫,看到了splinter这个库,这个库主要运用于前端测试的小工具,但是也可以和爬虫结合起来进行一些信息抓取的工作.
其实原理很简单就是找到相应按钮的id然后调用点击函数,在你想填入文字的edit框中添加相应的内容就ok了,只不过不需要你手动去点,现在这个代码其实还可以优化,比如说可以将所有车次加入到一个字典中,之后你就直接输入车次就ok了,不用现在还得查车次的顺序和位置.
验证码这一块还是没有好的解决办法,也没有相应的开源库,只能手动验证或者链接打码兔的api都可以.
运行下方代码得手动输入一下账号和密码,还得登录12306找一下自己地点的cookies,方法很简单就是进入12306买票界面,输入完地点之后,找到cookies这个单词,点开之后里面会有_jc_save_开头的几个属性,记录一下就OK.
from splinter.browser import Browser
from time import sleep
username = ""
password = ""
start = "%u5317%u4EAC%2CBJP"#北京
end = "%u6C88%u9633%2CSYT"#沈阳
time = "2016-01-23"
order = 1#预订第一个车次,如果为0则预订离现在时间最近有票的车次
ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
login_url = "https://kyfw.12306.cn/otn/login/init"
initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
def qiangpiao():
global b
b = Browser()
b.visit(ticket_url)
while b.is_text_present(u"登录"):
sleep(1)
b.find_by_text(u"登录").click()
sleep(3)
b.fill("loginUserDTO.user_name",username)
sleep(1)
b.fill("userDTO.password",password)
sleep(1)
print "等待验证码,自行输入..."
sleep(10)
if b.url == initmy_url:
break
try:
b.visit(ticket_url)
b.cookies.add({"_jc_save_fromDate":time})
b.cookies.add({"_jc_save_fromStation":start})
b.cookies.add({"_jc_save_toStation":end})
b.reload()
b.find_by_text(u"查询").click()
if order != 0:
while b.url == ticket_url:
b.find_by_text(u"预订")[order-1].click()
b.find_by_text(u"邓京东").click()
else:
while b.url == ticket_url:
for i in b.find_by_text(u"预订"):
i.click()
b.find_by_text(u"邓京东").click()
print "等待验证码,自行输入..."
except Exception as e:
print str(e)
if __name__ == "__main__":
qiangpiao()