1. 程式人生 > >Python爬蟲-嘗試使用人工和OCR處理驗證碼模擬登入

Python爬蟲-嘗試使用人工和OCR處理驗證碼模擬登入

此次是我第一次模擬登入,目標站點是知乎。
剛開始在網上看別人一直在說知乎登入首頁有有倒立的漢字驗證碼,我開啟自己的知乎登入頁面,發現只有賬號和密碼,他們說的倒立的驗證碼去哪了,後面仔細一想我之前登入過知乎,應該在本地存在cookies,然後我將cookies刪除掉果然就有需要驗證碼了:

分析-01.png

參考了大多數的意見,可以模擬登入移動端,驗證碼形式是我們常見的字母數字組合,避開這個點選倒立的驗證碼形式,然後我就在移動端抓包了,可以拿到驗證碼圖片的包,我們可以請求這個URL拿到每次的驗證碼:

分析-02.png

搜尋”

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識別的結果都是有問題的,結果是這樣的:

分析-07.png