python爬蟲學習筆記 3.6 (處理一些格式規範的文字)

python爬蟲學習筆記 3.6 (處理一些格式規範的文字)

處理給規範的文字

處理的大多數文字最好都是比較乾淨、格式規範的。格式規範的文字通常可以滿足一些需求,通常格式規範的文字具有以下特點:

  • 使用一個標準字體(不包含手寫體、草書,或者十分“花哨的”字體)
  • 即使被複印或拍照,字體還是很清晰,沒有多餘的痕跡或污點
  • 排列整齊,沒有歪歪斜斜的字
  • 沒有超出圖片範圍,也沒有殘缺不全,或緊緊貼在圖片的邊緣
    文字的一些格式問題在圖片預處理時可以進行解決。例如,可以把圖片轉換成灰度圖,調整亮度和對比度,還可以根據需要進行裁剪和旋轉(詳情需要了解圖像與信號處理)等。
    在這裏插入圖片描述
    cat text.txt 即可顯示結果。

識別結果很準確,不過符號^和*分別被表示成了雙引號和單引號。大體上可以讓你很舒服地閱讀。

通過Python代碼實現

import pytesseract
from PIL import Image

image = Image.open('test.jpg')
text = pytesseract.image_to_string(image)
print text
運行結果:

This is some text, written in Arial, that will be read by
Tesseract. Here are some symbols: !@#$%"&*()

對圖片進行閾值過濾和降噪處理(瞭解即可)

很多時候我們在網上會看到這樣的圖片:
在這裏插入圖片描述
Tesseract 不能完整處理這個圖片,主要是因爲圖片背景色是漸變的,最終結果是這樣:
在這裏插入圖片描述
隨着背景色從左到右不斷加深,文字變得越來越難以識別,Tesseract 識別出的 每一行的最後幾個字符都是錯的。

遇到這類問題,可以先用 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")

通過一個閾值對前面的“模糊”圖片進行過濾的結果
在這裏插入圖片描述

從網站圖片中抓取文字

用 Tesseract 讀取硬盤裏圖片上的文字,可能不怎麼令人興奮,但當我們把它和網絡爬蟲組合使用時,就能成爲一個強大的工具。

網站上的圖片可能並不是故意把文字做得很花哨 (就像餐館菜單的 JPG 圖片上的藝術字),但它們上面的文字對網絡爬蟲來說就是隱藏起來 了,舉個例子:

  • 雖然亞馬遜的 robots.txt 文件允許抓取網站的產品頁面,但是圖書的預覽頁通常不讓網絡機 器人採集。

  • 圖書的預覽頁是通過用戶觸發 Ajax 腳本進行加載的,預覽圖片隱藏在 div 節點 下面;其實,普通的訪問者會覺得它們看起來更像是一個 Flash 動畫,而不是一個圖片文 件。當然,即使我們能獲得圖片,要把它們讀成文字也沒那麼簡單。

  • 下面的程序就解決了這個問題:首先導航到托爾斯泰的《戰爭與和平》的大字號印刷版 1, 打開閱讀器,收集圖片的 URL 鏈接,然後下載圖片,識別圖片,最後打印每個圖片的文 字。因爲這個程序很複雜,利用了前面幾章的多個程序片段,所以我增加了一些註釋以讓 每段代碼的目的更加清晰:

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

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

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())

和我們前面使用 Tesseract 讀取的效果一樣,這個程序也會完美地打印書中很多長長的段落,第六頁的預覽如下所示:

6
     "A word of friendly advice, mon
     cher. Be off as soon as you can,
     that's all I have to tell you. Happy
     he who has ears to hear. Good-by,
     my dear fellow. Oh, by the by!" he
     shouted through the doorway after
     Pierre, "is it true that the countess
     has fallen into the clutches of the
     holy fathers of the Society of je-
     sus?"
     Pierre did not answer and left Ros-
     topchin's room more sullen and an-
     gry than he had ever before shown
     himself.

但是當文字出現在彩色封面上時,結果就不那麼完美了:

  WEI' nrrd Peace
   Len Nlkelayevldu Iolfluy
   Readmg shmdd be ax
   wlnvame asnossxble Wenfler
   an mm m our cram: Llhvary
    - Leo Tmsloy was a Russian rwovelwst
    I and moval phflmopher med lur
    A ms Ideas 01 nonviolenx reswslance m 5 We range     0, "and"

如果想把文字加工成普通人可以看懂的效果,還需要花很多時間去處理。

比如,通過給 Tesseract 提供大量已知的文字與圖片映射集,經過訓練 Tesseract 就可以“學會”識別同一種字體,而且可以達到極高的精確率和準確率,甚至可以忽略圖片中文字的背景色和相對位置等問題。

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