第三方打碼平臺進(jìn)行復(fù)雜驗證碼的識別
上節(jié)課我們使用了 Pyesseract 進(jìn)行了簡單的驗證碼圖片識別,但是通過上節(jié)課的效果來看 Pyesseract 的效果似乎并不是很好,如果碰到一些復(fù)雜的驗證碼估計就得歇菜了。但是我們在爬蟲開發(fā)中會遇到的驗證碼可以說是形形色色,各種各樣,幾乎都快玩出花來了。
不妨設(shè)想一下,如果爬蟲遇到了 Pyesseract 無法識別的驗證碼該怎么辦呢?難道爬蟲就不寫了嗎?我覺得老板可能不太愿意啊,所以這節(jié)課給你推薦另一種驗證碼識別方式,那就是 – 第三方打碼平臺。
俗話說三個臭皮匠還頂個諸葛亮呢,我們在實際開發(fā)中遇到解決不了的難題的時候一定不要在那里悶頭坐著死扣,一定要善用搜索引擎。編程這個行業(yè)發(fā)展了這么多年,沒準(zhǔn)你碰到的問題早就被別人解決了還把解決問題的方法分享了出來呢
本節(jié)課學(xué)習(xí)目標(biāo):
能夠熟練的使用一種第三方打碼平臺識別驗證碼。
1. 常見的第三方打碼平臺
平時常用的打碼平臺有:超級鷹,云打碼,打碼兔,聯(lián)眾打碼,超人打碼,斐斐打碼,91打碼等。讀者可以更加自己的需要自行選擇。
2. 打碼平臺進(jìn)行打碼步驟
使用第三方平臺進(jìn)行打碼,通常需要四個步驟。我們這里使用超級鷹打碼平臺進(jìn)行示范。
- 首先選擇一個打碼平臺進(jìn)行注冊
由于不同平臺,注冊的流程不一樣,這里不再截圖演示。注冊完成后,如果沒有提供免費(fèi)適用的功能,我們需要充值才能正確的使用接口。每個平臺,都會有自己的開發(fā)文檔,我們按照開發(fā)文檔的示列進(jìn)行改寫就可以直接使用了。
- 需要進(jìn)行充值
如果只是簡單的測試,可以充值較小的金額,由于是第三方平臺,無法保證網(wǎng)站是持久可用的,充值須謹(jǐn)慎。
- 獲取網(wǎng)站的程序ID
充值完成后,我們會獲得一個程序ID,把這個ID放入到接口中,方便第三方平臺進(jìn)行校驗。
- 上傳驗證碼,返回調(diào)用結(jié)果。
3. 打碼平臺對接例子
接下來我們用一個簡單的例子來具體演示一下上面的步驟:
這里,我們隨便選擇了一個打碼平臺的接口例子來進(jìn)行講解。
關(guān)于如何在打碼平臺上進(jìn)行注冊和查找接口文檔,由于打碼平臺的不穩(wěn)定性,這里不做推薦,讀者可以自行百度,選擇適合自己的平臺進(jìn)行注冊和使用。在確定打碼平臺的可靠性的前提下,再進(jìn)行充值。謹(jǐn)防被騙!
我們接下來通過打碼平臺驗證如下驗證碼,驗證碼圖片如下:
代碼如下:
#!/usr/bin/env python
# coding:utf-8
import requests
from hashlib import md5
#客戶端類
class My_Client(object):
#初始化
def __init__(self, username, password, soft_id):
self.username = username
self.password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
#上傳圖片
def PostPic(self, im, codetype):
"""
im: 圖片字節(jié)
codetype: 題目類型
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
#錯誤反饋
def ReportError(self, im_id):
"""
im_id:報錯題目的圖片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
if __name__ == '__main__':
chaojiying = My_Client('XXX', 'XXX', 'XXX')
im = open('a.jpg', 'rb').read()
print(chaojiying.PostPic(im, XXX))
上述代碼,我們總共有三個方法,分別是初始化,上傳圖片和錯誤反饋。初始化主要是初始化一些基本的信息,這些可以在打碼平臺注冊的地方獲取。另外,打碼平臺還會提供一個打碼平臺提供的識別碼SoftId。初始化成功后,我們上傳驗證碼,最后打印出結(jié)果。可以看到結(jié)果為7261,跟驗證碼里面的文字一致。
運(yùn)行結(jié)果如下:
4. 小結(jié)
由于打碼平臺良莠不齊,讀者選擇打碼平臺的時候,需要選一些知名的企業(yè),另外,使用打碼的平臺的時候,需要按照不同平臺的規(guī)定接口進(jìn)行調(diào)用,不同打碼平臺的規(guī)范是不一樣的。