python爬蟲 -- 12306登入刷票
阿新 • • 發佈:2018-12-27
# -*- coding: utf-8 -*- from splinter.browser import Browser from time import sleep import traceback # Message: 'phantomjs' executable needs to be in PATH. # geckodriver 要自行下載 # phantomjs 自行下載 # we need: # sudo mv geckodriver /usr/local/bin/ # 1. 自動識別驗證碼--文字 圖片等 # 2. 選擇: G?D?C? 靠窗?走廊? 二等座?頭等座? # 3. 12306的驗證碼是一個jpg,如果你是通過url獲取這個圖片,會和登陸介面的不同,由隨機因子產生的.通過截圖方式來解析: # 識別文字: 轉換為圖片中的圖畫,給個位置然後觸發click事件 #初始化資訊 # 使用者名稱,密碼 username = u"
[email protected]" passwd = u"yourpassword" # cookies值: 頁面資訊--安全--檢視cookies shenzhen = u"%u6DF1%u5733%2CSZQ" #深圳 wuhan = u"%u6B66%u6C49%2CWHN" #武漢 yueyangdong = u"%u5CB3%u9633%u4E1C%2CYIQ" #岳陽東 #shanghai = u"%u4E0A%u6D77%2CSHH" #上海 #taiyuan = u"%u592A%u539F%2CTYV" # 太原 #hangzhou = u"%u676D%u5DDE%u4E1C%2CHGH" #杭州東 starts = shenzhen ends = yueyangdong # 時間格式2018-01-02 dtime = u"2018-02-10" # 車次,選擇第幾趟,0則從上之下依次點選 order = 0 ###乘客名,如果是自己,則上面有個連結是自己的,會跳轉到個人中心,用index[1] #如果乘客不是自己,則用index[0] pa = u"張三" ###乘客名 users = [u"張三", u"李四"] """網址""" 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 login(): #點選登入,從購票頁面調到了登入頁面 b.find_by_text(u"登入").click() sleep(3) #給name為loginUserDTO.user_name附上使用者名稱 #也可以用Id查詢的方法b.find_by_id(‘username‘).fill(username) b.fill("loginUserDTO.user_name", username) sleep(1) #給name為userDTO.password值 b.fill("userDTO.password", passwd) sleep(1) # 手動輸入驗證碼, 自動驗證的方式還在研究中: a.獲取圖片驗證碼(截圖方式,應該是不能通過獲取圖片的連結地址來獲取圖片?,或者其他方式:cookies/session? b.解析圖片驗證碼(通過位置?還是真正意義的影象識別?) # 瞭解下ocr( tesseract-ocr), pytesseract?CNN卷積神經網路? print u"等待驗證碼,自行輸入..." #檢測頁面是否跳轉(使用者是否輸入了驗證碼並且提交) while True: if b.url != initmy_url: sleep(1) else: break def huoche(): global b # b = Browser(driver_name="firefox", executable_path="/usr/bin/firefox") b = Browser(driver_name="firefox") print u"訪問12306..." b.visit(ticket_url) #查詢帶登入的字串,u是避免中文報錯 while b.is_text_present(u"登入"): sleep(1) #如果存在呼叫登入方法 login() if b.url == initmy_url: break #當執行完login方法後,登入成功,繼續向下執行 try: print u"購票頁面..." # 跳回購票頁面 b.visit(ticket_url) # 載入查詢資訊 b.cookies.add({"_jc_save_fromStation": starts}) b.cookies.add({"_jc_save_toStation": ends}) b.cookies.add({"_jc_save_fromDate": dtime}) b.reload() sleep(2) # 增加過濾條件,,, b.find_by_text(u"GC-高鐵/城際").click() count = 0 # 迴圈點選預訂 #order=0則從第一班車開始全部一次預訂 if order != 0: #如果頁面沒有跳轉到,說明沒有搶到票,繼續搶票 while b.url == ticket_url: #點選查詢進行重新整理 b.find_by_text(u"查詢").click() count +=1 print u"迴圈點選查詢... 第 %s 次" % count sleep(1) try: #點選預訂的那班車 b.find_by_text(u"預訂")[order - 1].click() except: print u"還沒開始預訂" continue else: while b.url == ticket_url: b.find_by_text(u"查詢").click() count += 1 print u"迴圈點選查詢... 第 %s 次" % count sleep(1) try: #從第一個開始一次預訂 for i in b.find_by_text(u"預訂"): i.click() except: print u"還沒開始預訂" continue sleep(1) print u"開始選擇使用者..." for user in users: b.find_by_text(user).last.click() #for user in self.users: # b.find_by_text(user).last.click() print u"提交訂單..." sleep(1) b.find_by_text(u"提交訂單").click() sleep(0.5) b.find_by_text(u"確認").click()#此處是指令碼,待改善 #若迴圈結束了,則選擇聯絡人 #b.find_by_text(pa)[0].click() print u"能做的都做了.....不再對瀏覽器進行任何操作" except Exception as e: print(traceback.print_exc()) if __name__ == "__main__": huoche()
# -*- coding: utf-8 -*- # 僅可用來爬取資料後來進行測試分析 #import ssl import urllib2 import time i=1 while(1): print "開始捕獲第%s張圖片" % str(i) #if hasattr(ssl, '_create_unverified_context'): # ssl._create_default_https_context = ssl._create_unverified_context #ssl._create_default_https_context = ssl._create_unverified_context #req = urllib2.Request("https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.03777190844118017") req = urllib2.Request("https://kyfw.12306.cn/passport/captcha/captcha-image?*") u = urllib2.urlopen(req) data = u.read() print "捕獲中.........." with open("CodePng20180119-"+str(i)+".jpg", 'wb') as f: time.sleep(2) f.write(data) i += 1 print "捕獲結束!" # python3中使用 urllib.request 代替urllib2
補充下: 獲取驗證碼,用於今後自動識別的源.