1. 程式人生 > >自動買票工具 python-splinter

自動買票工具 python-splinter

今天又沒買到回家的火車票......

我表示很鬧心,最近正好在研究知乎助手的那個小爬蟲,看到了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()