Python爬蟲-嘗試使用人工和OCR處理驗證碼模擬登入
阿新 • • 發佈:2019-02-03
此次是我第一次模擬登入,目標站點是知乎。
剛開始在網上看別人一直在說知乎登入首頁有有倒立的漢字驗證碼,我開啟自己的知乎登入頁面,發現只有賬號和密碼,他們說的倒立的驗證碼去哪了,後面仔細一想我之前登入過知乎,應該在本地存在cookies,然後我將cookies刪除掉果然就有需要驗證碼了:
參考了大多數的意見,可以模擬登入移動端,驗證碼形式是我們常見的字母數字組合,避開這個點選倒立的驗證碼形式,然後我就在移動端抓包了,可以拿到驗證碼圖片的包,我們可以請求這個URL拿到每次的驗證碼:
搜尋”
def get_xsrf():
url='https://www.zhihu.com/signin?next=/'
html=session.get(url=url,headers=headers).text
pattern=re.compile('.*?<input type="hidden" name="_xsrf" value="(.*?)"/>', re.S)
_xsrf=re.search(pattern,html).group(1)
if _xsrf:
print('_xsrf獲取成功:'+ _xsrf)
return _xsrf
else:
print('_xsrf獲取失敗')
對於captcha,就是驗證碼了,在剛開始的時候也提到了,可以請求相應的URL,拿到每次所需的驗證碼,人工來識別驗證碼的好處就是準確率高,這裡我嘗試使用了,人工識別的方法:
驗證碼圖片會下載至專案所在的資料夾,開啟圖片,輸入驗證碼即可
def get_captcha():
t=int(time.time()*1000)
url='https://www.zhihu.com/captcha.gif?r='+str(t)+'&type=login'
content=session.get(url=url,headers=headers).content
with open('captcha.jpg','wb') as f:
f.write(content)
im=Image.open('captcha.jpg')
im.show()
time.sleep(5 )
im.close()
return input('請輸入驗證碼:')
後面我又嘗試使用OCR(Optical Character Recogintion,光學字元識別),所用到的包是pytesseract,看能不能夠自動識別,但是顯然效果是很差的,在此也記錄一下:
def get_captcha():
t=int(time.time()*1000)
url='https://www.zhihu.com/captcha.gif?r='+str(t)+'&type=login'
content=session.get(url=url,headers=headers).content
with open('captcha.jpg','wb') as f:
f.write(content)
im=Image.open('captcha.jpg') #把彩色影象轉化成灰度影象
gray=im.convert('L')
gray.show()
threshold=200 #二值化處理
table=[]
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
out=gray.point(table,'1')
out.show()
out.save('captcha_thresholded.jpg')
th=Image.open('captcha_thresholded.jpg') #使用Tesseract進行圖片識別
print(pytesseract.image_to_string(th))
return pytesseract.image_to_string(th)
試了幾次,OCR識別的結果都是有問題的,結果是這樣的: