打碼平臺破解驗證碼+session登陸豆瓣
上節部落格(連結https://blog.csdn.net/MG1723054/article/details/81900983)談到利用python實現登陸的三種方法,其中利用session登陸網站的方法具有比較不錯的效果,不需要考慮cookie的時效性,但是有一個潛在的問題是有些文字驗證碼用一般的程式很難破解,主要是識別度不高,為了提高識別有多種方法,包含機器學習訓練驗證碼,利用OpenCV中的點降噪或者線降噪,還有就是利用打碼平臺,將程式接到打碼平臺讓別人解決驗證碼問題(相當於是一個黑盒,我們只需要傳入驗證碼圖片,然後輸出驗證碼字元),網上的打碼平臺有很多,我選擇的是超級鷹打碼平臺(http://www.chaojiying.com/
#!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Chaojiying_Client(object):###這裡面類名與之前的有所改變 def __init__(self, username, password, soft_id): self.username = username 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: 圖片位元組 codetype: 題目型別 參考 http://www.chaojiying.com/price.html """ 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() ####chaojingyi.py檔案,等下匯入到別的程式中
介紹了這麼多,下面我們進入正題。我們先點選進入豆瓣登陸首頁,開啟原始碼找到驗證碼圖片。如下圖所示。
利用 正則表示式提取出連結地址,這樣我們就得到了圖片的連結,然後再將圖片下載在指定的檔案中。程式碼如下,該段程式碼相對比較簡單
import requests,re login_url='https://accounts.douban.com/login' def get_imge_url(): rep=requests.get(login_url,headers={'User-Agent':'Mozilla/5.0'}) res=re.compile('<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>') imge_url=re.findall(res,rep.text) return imge_url[0] def download_imge(url,filename): byte=requests.get(url,headers={'User-Agent':'Mozilla/5.0'}) with open (filename,'wb') as f: f.write(byte.content)
再次我們怎麼樣將圖片傳入超級鷹平臺,根據該網站提供的例項,我們只要這樣即可:
chaojiying = Chaojiying_Client('超級鷹賬號', '超級鷹密碼', '超級鷹ID')
im = open(filename, 'rb').read()
yanzhengma=chaojiying.PostPic(im, 1902)['pic_str']
最後,我們需要解決的是怎麼樣傳送表單,於是我們開啟開發者模式,勾選preserve log,然後再登陸頁面的賬號,密碼,驗證碼隨便輸入字元(先不要輸入正確的賬號密碼和驗證碼,便於後面的分析),點選登陸,我們在DOC選項中看到一個post請求,然後我們看下面的表單,果然是我們當時輸入的賬號,密碼,和驗證碼,如下圖所示。
前面我們已經解決了驗證碼問題,現在這表單裡面還有一個需要構造的引數,也就是captcha_id,仔細觀察該captcha_id鍵的值我們可以知道,這個就是在驗證碼圖片連結https://www.douban.com/misc/captcha?id=GU3dsxGehVnCmQ5IaWIipDKo:en&size=s
中的資料,我們就利用正則表示式來構造它,這樣所有的表單構造全部完成。這也是利用打碼平臺破解驗證碼,session登陸豆瓣的全部思路。
下面我們給出完整程式碼:
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 21 16:18:38 2018
@author: NJUer
"""
import requests,re
from chaojiying import Chaojiying_Client ###匯入chaojiying模組中的Chaojiying_Client
login_url='https://accounts.douban.com/login'
def get_imge_url(): ###獲取驗證碼連結
rep=requests.get(login_url,headers={'User-Agent':'Mozilla/5.0'})
res=re.compile('<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>')
imge_url=re.findall(res,rep.text)
return imge_url[0]
def download_imge(url,filename):
byte=requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
with open (filename,'wb') as f:
f.write(byte.content)####下載驗證碼圖片
def post_data(id_string,yanzhengma): ###提交表單
form_data={'source':'index_nav',
'redir:https':'//www.douban.com/',
'form_email':'[email protected]',
'form_password':'豆瓣賬號',
'captcha-solution':'豆瓣密碼',###自己註冊豆瓣賬號密碼
'captcha-id':id_string,
'login':'登入',
}
session=requests.session()
session.post(login_url,data=form_data)
infor=session.get('https://www.douban.com/',headers={'User-Agent':'Mozilla/5.0'})
infor.encoding='utf-8'
if '方天畫戟呂奉先的帳號'in infor.text : ###測試是否登陸成功,因為我的賬號
###名稱為‘方天畫戟呂奉先’,所以登陸成功必然會有顯示
print('登陸成功!')
else :
print('登陸失敗!')
print(infor.text[0:10000])
if __name__ == '__main__':
chaojiying = Chaojiying_Client('超級鷹賬號', '超級鷹密碼', '超級鷹ID')###自己註冊
url= get_imge_url()
id_string=url.split('=')[1].split("&")[0] ###獲取驗證碼的ID
filename='C:\\Users\\FangWei\\Desktop\\網路爬蟲\\chaojiying_Python\\豆瓣.jpg'
download_imge(url,filename)
im = open(filename, 'rb').read()
yanzhengma=chaojiying.PostPic(im, 1902)['pic_str']
post_data(id_string,yanzhengma)
執行部分結果如下:
利用打碼平臺破解驗證碼相對於機器學習來說,學習時間短,不需要我們知道怎麼去識別,機器學習學習週期長,不易理解,所以使用打碼平臺是一個不錯的選擇。
原創不易 如若轉載 請註明作者和出處,謝謝!