python爬蟲學習筆記 3.7 (嘗試對驗證碼進行機器識別處理)

python爬蟲學習筆記 3.7 (嘗試對驗證碼進行機器識別處理)

嘗試對知乎網驗證碼進行處理:

許多流行的內容管理系統即使加了驗證碼模塊,其衆所周知的註冊頁面也經常會遭到網絡 機器人的垃圾註冊。

那麼,這些網絡機器人究,竟是怎麼做的呢?既然我們已經,可以成功地識別出保存在電腦上 的驗證碼了,那麼如何才能實現一個全能的網絡機器人呢?

大多數網站生成的驗證碼圖片都具有以下屬性。

  • 它們是服務器端的程序動態生成的圖片。驗證碼圖片的 src 屬性可能和普通圖片不太一 樣,但是可以和其他+ 圖片一樣進行 下載和處理。
  • 圖片的答案存儲在服務器端的數據庫裏。
  • 很多驗證碼都有時間限制,如果你太長時間沒解決就會失效。
  • 常用的處理方法就是,首先把驗證碼圖片下載到硬盤裏,清理乾淨,然後用 Tesseract 處理 圖片,最後返回符合網站要求的識別結果。
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
import time
import pytesseract
from PIL import Image
from bs4 import BeautifulSoup

def captcha(data):
    with open('captcha.jpg','wb') as fp:
        fp.write(data)
    time.sleep(1)
    image = Image.open("captcha.jpg")
    text = pytesseract.image_to_string(image)
    print "機器識別後的驗證碼爲:" + text
    command = raw_input("請輸入Y表示同意使用,按其他鍵自行重新輸入:")
    if (command == "Y" or command == "y"):
        return text
    else:
        return raw_input('輸入驗證碼:')

def zhihuLogin(username,password):

    # 構建一個保存Cookie值的session對象
    sessiona = requests.Session()
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0'}

    # 先獲取頁面信息,找到需要POST的數據(並且已記錄當前頁面的Cookie)
    html = sessiona.get('https://www.zhihu.com/#signin', headers=headers).content

    # 找到 name 屬性值爲 _xsrf 的input標籤,取出value裏的值
    _xsrf = BeautifulSoup(html ,'lxml').find('input', attrs={'name':'_xsrf'}).get('value')

    # 取出驗證碼,r後面的值是Unix時間戳,time.time()
    captcha_url = 'https://www.zhihu.com/captcha.gif?r=%d&type=login' % (time.time() * 1000)
    response = sessiona.get(captcha_url, headers = headers)


    data = {
        "_xsrf":_xsrf,
        "email":username,
        "password":password,
        "remember_me":True,
        "captcha": captcha(response.content)
    }

    response = sessiona.post('https://www.zhihu.com/login/email', data = data, headers=headers)
    print response.text

    response = sessiona.get('https://www.zhihu.com/people/maozhaojun/activities', headers=headers)
    print response.text


if __name__ == "__main__":
    zhihuLogin('[email protected]','ALAxxxxIME')

嘗試處理中文字符

如果手頭上有中文的訓練數據,也可以嘗試對中文進行識別。

命令:tesseract --list-langs可以查看當前支持的語言,chi_sim表示支持簡體中文。
在這裏插入圖片描述
那麼在使用時候,可以指定某個語言來進行識別,如:

tesseract -l chi_sim paixu.png paixu
在這裏插入圖片描述

表現在程序裏,則可以這麼寫:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from PIL import Image
import subprocess

def cleanFile(filePath)
    image = Image.open(filePath)

    # 調用系統的tesseract命令, 對圖片進行OCR中文識別
    subprocess.call(["tesseract", "-l", "chi_sim", filePath, "paixu"])

    # 打開文件讀取結果
    with open("paixu.txt", 'r') as f:
        print(f.read())

if __name__ == "__main__":
    cleanFile("paixu.png")

結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章