1. 程式人生 > >爬蟲之簡單驗證碼處理

爬蟲之簡單驗證碼處理

sleep 圖書 url lse right num ESS 去掉 視覺

  機器視覺的一個分支:文字識別,介紹如何用一些 Python庫來識別和使用在線圖片中的文字。將圖像翻譯成文字一般被稱為光學文字識別(Optical Character Recognition, OCR)。可以實現OCR的底層庫並不多,目前很多庫都是使用共同的幾個底層 OCR 庫,或者是在上面 進行定制。在這裏我們只重點介紹:Tesseract

  Tesseract 是一個 OCR 庫,目前由 Google 贊助(Google 也是一家以 OCR 和機器學習技術聞名於世的公司)。Tesseract 是目前公認最優秀、最精確的開源 OCR 系統,除了極高的精確度,Tesseract 也具有很高的靈活性。它可以通過訓練識別出任何字體,也可以識別出任何 Unicode 字符。

Windows 系統

下載可執行安裝文件https://code.google.com/p/tesseract-ocr/downloads/list安裝。

Linux 系統

可以通過 apt-get 安裝: $sudo apt-get tesseract-ocr

Tesseract 是一個 Python 的命令行工具,不是通過 import 語句導入的庫。安裝之後,要用 tesseract 命令在 Python 的外面運行,但我們可以通過 pip 安裝支持Python 版本的 Tesseract庫:

pip install pytesseract

import pytesseract
from PIL import Image

image = Image.open(‘test.jpg‘)
text = pytesseract.image_to_string(image)
print(text)

用 Python 腳本對圖片進行清理,利用 PIL 庫,我們可以創建一個閾值過濾器來去掉漸變的背景色,只把文字留下來,從而讓圖片更加清晰,便於 Tesseract 讀取:

from PIL import Image
import subprocess

def cleanFile(filePath, newFilePath):
    image = Image.open(filePath)

    # 對圖片進行閾值過濾(低於143的置為黑色,否則為白色)
    image = image.point(lambda x: 0 if x < 143 else 255)
    # 重新保存圖片
    image.save(newFilePath)

    # 調用系統的tesseract命令對圖片進行OCR識別     
    subprocess.call(["tesseract", newFilePath, "output"])

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

if __name__ == "__main__":
    cleanFile("text2.png", "text2clean.png")

從網站圖片中抓取文字

下面的程序就是從網站圖片中抓取文字:首先打開閱讀器,收集圖片的 URL 鏈接,然後下載圖片,識別圖片,最後打印每個圖片的文 字。因為這個程序很復雜,利用了前面幾章的多個程序片段,所以我增加了一些註釋以讓 每段代碼的目的更加清晰:

import time
from urllib.request import urlretrieve
import subprocess
from selenium import webdriver
#創建新的Selenium driver
driver = webdriver.PhantomJS()

# 用Selenium試試Chrome瀏覽器:
# driver = webdriver.Chrome()

driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200")
# 單擊圖書預覽按鈕
driver.find_element_by_id("sitbLogoImg").click()
imageList = set()
# 等待頁面加載完成
time.sleep(5)
# 當向右箭頭可以點擊時,開始翻頁
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):
driver.find_element_by_id("sitbReaderRightPageTurner").click()
time.sleep(2)
# 獲取已加載的新頁面(一次可以加載多個頁面,但是重復的頁面不能加載到集合中)
pages = driver.find_elements_by_xpath("//div[@class=‘pageImage‘]/div/img")
for page in pages:
image = page.get_attribute("src")
imageList.add(image)
driver.quit()

# 用Tesseract處理我們收集的圖片URL鏈接
for image in sorted(imageList):
# 保存圖片
urlretrieve(image, "page.jpg")
p = subprocess.Popen(["tesseract", "page.jpg", "page"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
f = open("page.txt", "r")
p.wait()
print(f.read())

爬蟲之簡單驗證碼處理