爬蟲驗(yàn)證碼中還是有很多的特別難破解的,比如BT的12306

哈哈~,是不是被難倒了,沒關(guān)系,這次說的是打碼平臺,可以有效解決這類問題。
這次主要說說超級鷹:http://www.chaojiying.com/,進(jìn)去之后呢,首先要找到開發(fā)文檔

下載即可,里面的內(nèi)容還是很簡潔和容易理解的,這里就不詳細(xì)說明了,下載完后之后把超級鷹開發(fā)文檔和你的代碼放在同級目錄下,然后就開始進(jìn)入正題吧。
以這個url為例:https://kyfw.12306.cn/otn/login/init

打開大概就是這個樣子,我們要先獲取到驗(yàn)證碼圖片
browser = webdriver.Chrome()
browser.get(url)
time.sleep(15)
img = browser.find_element_by_class_name('touclick-image')
延時稍微長了一點(diǎn),為了防止驗(yàn)證碼圖片加載不出來,然后我們需要這個驗(yàn)證碼圖片的左上角和右下角的坐標(biāo)。
left = img.location['x']#驗(yàn)證碼圖片左上角橫坐標(biāo)
top? ? = img.location['y']#驗(yàn)證碼圖片左上角縱坐標(biāo)
right? = left + img.size['width']#驗(yàn)證碼圖片右下角橫坐標(biāo)
bottom = top + img.size['height']#驗(yàn)證碼圖片右下角縱坐標(biāo)
將驗(yàn)證碼圖片保存成二進(jìn)制文件,因?yàn)槌夲椖沁咈?yàn)證需要傳入驗(yàn)證碼圖片的二進(jìn)制數(shù)據(jù)。
#頁面快照
screenshot = browser.get_screenshot_as_png()
#打開快照文件
screenshot = Image.open(BytesIO(screenshot))
#截取驗(yàn)證碼圖片
captcha = screenshot.crop((left, top, right, bottom))
captcha.save("./name.png")
bytes_array = BytesIO()
#圖片二進(jìn)制
captcha.save(bytes_array,format='PNG')
這一步有點(diǎn)看不懂的可以看我的另一片文章 爬蟲 之 驗(yàn)證碼(一),里面比較詳細(xì)一點(diǎn)。
然后超級鷹要登場了
chaojiying = Chaojiying(賬號, 密碼, id) ? ?? #id 請參考圖片1-4
result = chaojiying.post_pic(bytes_array.getvalue(), 驗(yàn)證碼類型編號) ?? #二進(jìn)制數(shù)據(jù)和類型編號,類型編號請參考圖片1-5


最后就是處理一下超級鷹返回的結(jié)果,模擬點(diǎn)擊即可
#驗(yàn)證碼結(jié)果進(jìn)行解析
groups = result.get('pic_str').split('|')
#遍歷驗(yàn)證結(jié)果,再用逗號切分變量后的驗(yàn)證結(jié)果,轉(zhuǎn)換成整數(shù)
locations = [[int(number)for numberin group.split(',')]for groupin groups]
for locationin locations:
????print(location)
????# 當(dāng)前頁面點(diǎn)擊,move_to_element_with_offset:把鼠標(biāo)移動到某個偏移量 ? 的 ? 位 ? 置, ? ? 相對于圖片左上角的位置,perform()連續(xù)執(zhí)行
? ? ActionChains(browser).move_to_element_with_offset(img, location[0],location[1]).click().perform()
????time.sleep(1)
最后附上源碼和運(yùn)行結(jié)果
import time
from seleniumimport webdriver
from PILimport Image
from ioimport BytesIO
from selenium.webdriverimport ActionChains
from chaojiyingimport Chaojiying
EMAIL ='賬號'
PASSWORD ='密碼'
CHAOJIYING_SOFT_ID ="id"
CHAOJIYING_KIND =9004
#賬號、密碼、解碼類型編號
chaojiying = Chaojiying(EMAIL, PASSWORD, CHAOJIYING_SOFT_ID)
url ='https://kyfw.12306.cn/otn/login/init'
browser = webdriver.Chrome()
browser.get(url)
time.sleep(15)
img = browser.find_element_by_class_name('touclick-image')
left? = img.location['x']#驗(yàn)證碼圖片左上角橫坐標(biāo)
top? ? = img.location['y']#驗(yàn)證碼圖片左上角縱坐標(biāo)
right? = left + img.size['width']#驗(yàn)證碼圖片右下角橫坐標(biāo)
bottom = top + img.size['height']#驗(yàn)證碼圖片右下角縱坐標(biāo)
print(left, top, right, bottom)
#頁面快照
screenshot = browser.get_screenshot_as_png()
#打開快照文件
screenshot = Image.open(BytesIO(screenshot))
#截取驗(yàn)證碼圖片
captcha = screenshot.crop((left, top, right, bottom))
captcha.save("./name.png")
bytes_array = BytesIO()
#圖片二進(jìn)制
captcha.save(bytes_array,format='PNG')
result = chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)
#驗(yàn)證碼結(jié)果進(jìn)行解析
groups = result.get('pic_str').split('|')
#遍歷驗(yàn)證結(jié)果,再用逗號切分變量后的驗(yàn)證結(jié)果,轉(zhuǎn)換成整數(shù)
locations = [[int(number)for numberin group.split(',')]for groupin groups]
for locationin locations:
????print(location)
????# 當(dāng)前頁面點(diǎn)擊,move_to_element_with_offset:把鼠標(biāo)移動到某個偏移量的位置,相對 ? ? ? 于圖片左上角的位置,perform()連續(xù)執(zhí)行
? ? ActionChains(browser).move_to_element_with_offset(img, location[0],location[1]).click().perform()
????time.sleep(1)

成功率還是蠻高的,本篇文章到此結(jié)束,希望看到這篇文章的人有所收獲。