1. 程式人生 > >python爬蟲 -- 12306登入刷票

python爬蟲 -- 12306登入刷票

# -*- 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

補充下: 獲取驗證碼,用於今後自動識別的源.