12306登录python_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"username@mail.cn"
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
補充下: 獲取驗證碼,用于今后自動識別的源.
總結
以上是生活随笔為你收集整理的12306登录python_python爬虫 -- 12306登录刷票的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: steam搬砖项目讲解
- 下一篇: websocket python爬虫_p