【資料分析】Python爬蟲專案實作—辨識圖片文字/驗證碼、Pytesseract套件

Kao Jia
7 min readNov 9, 2023

--

延續前兩篇Python爬蟲程式入門,這篇將會記錄爬取圖片中的文字的方法。除了會使用到前一篇文章所使用的 selenium套件,這篇文章將使用 pytesseract 套件來辨識圖片中的文字,破解無法直接在網頁上複製文字的困境。此外,在遇到提交驗證碼的情況下也可以透過這個套件來辨識圖片中的文字自動回傳避開反爬蟲機制。

還沒有閱讀爬蟲入門的讀者可以前往以下傳送門:

🔸【資料分析】Python爬蟲入門實作(上) — 網頁架構、靜態網頁爬蟲

🔸【資料分析】Python爬蟲入門實作(下) — 動態網頁爬蟲、反反爬蟲、JSON 格式

目錄:
1. Pytesseract是什麼
2. Pytesseract套件安裝前,要先安裝Tesseract
2.1 Mac 安裝
2.2 Windows 安裝
3. 如何批量辨識圖片中的文字

Pytesseract是什麼

說到Pytesseract,我們可能要先提到 Tesseract。Tesseract是一個由Google開發的開源的文字辨識引擎,能夠將圖像中的文字轉換為可編輯的文本。而Pytesseract通常被用來在Python應用程式中實現文字辨識功能,使開發者能夠輕鬆地將圖片中的文字提取出來,進行後續處理或分析。

📍 官網走這邊:https://tesseract-ocr.github.io/

因此要安裝 Pytesseract 套件前,我們需要先在電腦中安裝 Tesseract,而這個過程真的是無比漫長⋯⋯

Pytesseract套件安裝前,要先安裝Tesseract

Mac安裝

如果你的電腦之前裝過 Homebrew,那就可以偷笑了😆,這個安裝過程會變得容易許多。只要在 terminal 上打以下兩行即可:

brew install imagemagick
brew install tesseract --all-languages

接著等電腦慢慢跑到安裝完成就行~

Windows 安裝

首先,我們需要先下載 Tesseract 檔案,下載點:https://digi.bib.uni-mannheim.de/tesseract/

接著請跟著這篇文章做:https://segmentfault.com/a/1190000039929696

重點是安裝完後記得設定環境變數!

📍良心建議在安裝前狂點下一步之前,請記得只先下載中文和英文兩種語言就好,否則全部語言安裝的話會等到⋯⋯4個小時⋯⋯🥲

Pytesseract 套件安裝

如同安裝其他套件一般,我們在 Terminal 也來安裝 Pytesseract:

pip install pytesseract

完成 pytesseract 套件的安裝後,我們可以在 Python 上練習一小段程式碼,看能否成功辨認圖片中的文字。以下以這張圖片中的文字為例:

captcha2.png
import pytesseract
from PIL import Image

image = Image.open('captcha2.png')
result = pytesseract.image_to_string(image)
print(result)

於是我們看到套件成功的辨認出圖片中的文字,太棒了!

如何批量辨識圖片中的文字

完成套件的下載後,我們就可以開始練習專案了!專案背景是我們今天在一個網站中找到一些我們想要的編號,然而這些編號都是以圖片呈現而無法直接以爬蟲爬取,此時我們可以搭配剛剛下載的 Pytesseract 套件批量辯識圖片中的編號。

📍以下是網站架構:

  1. 網站網址:https://ABC/shopping/household-goods.html
  2. 以上網站列出各種產品名稱(於<h3>底下),需要點進產品網址(<a>),才能找到放著產品編號的圖片:
from io import BytesIO
from selenium import webdriver
from selenium.webdriver.common.by import By
import numpy as np
from PIL import Image
import pandas as pd


browser = webdriver.Chrome()
browser.get('https://ABC/shopping/household-goods.html')
h3_elements = browser.find_elements(By.TAG_NAME, 'h3')

list_of_url=[]

for h3_element in h3_elements:
# 在h3元素内部查找產品網頁連結
link = h3_element.find_elements(By.TAG_NAME, 'a')
try:
# 由於link可能抓到多個,以最後一個link為主
href = link[-1].get_attribute("href")
list_of_url.append(href)
except IndexError:
continue

完成後,可以知道 list_of_url 存了產品們的網頁連結,然而爬取到的網頁可能包含非產品的網頁連結,如廣告網頁連結等。此時我們辨識出如果是產品網頁,其開頭都會是以 「https://ABC/」 作為開頭,於是我們使用正則表達式+迴圈去辨認在 list 中的每一個連結都是「https://ABC/」開頭:

import re
prefix = "https://ABC/"
matching_urls = [url for url in list_of_url if re.match(
f"^{re.escape(prefix)}", url)]

# 印出匹配的網址
for url in matching_urls:
print(url)

確保存在 matching_urls 皆為我們想要的產品網頁連結後,我們接下來要去各個網頁連結取得產品編號的圖片,A list 儲存商品名稱,B list 儲存商品編號:

browser = webdriver.Chrome()
A=[]
B=[]

for i in matching_urls:
browser.get(i)
A_name = browser.find_elements(By.TAG_NAME, 'h1')
A.append(A_name[0].get_attribute("innerText"))
captcha = browser.find_elements("css selector", '.tel')
image = Image.open(BytesIO(captcha[-1].screenshot_as_png))
result = pytesseract.image_to_string(image, config="digits")
#將換行符以空白取代
result = result.replace('\n', '')
B.append(result)

Product_list = {'網址':matching_urls,'產品': A, '編號': B}

df=pd.DataFrame(Product_list)

如此我們就完成了兩層網頁的爬取+圖片文字辨識的方法,以同樣的概念,讀者可以將這個套件應用在驗證碼的辨識上,來減少被反爬蟲擋掉的機率。那這次就先更新到這裡,下次見!😃

對於Python其他應用有興趣的話,也可參考下列文章:

1. 【資料分析】不寫程式也能爬!使用Chrome 網頁插件 Web Scraper 完成網頁爬蟲

2.【資料分析】如何用Python執行SQL語法

3. 【資料分析】Python爬蟲入門實作 — 網頁架構、靜態網頁爬蟲

4. 【資料分析】Python爬蟲入門實作(下) — 動態網頁爬蟲、反反爬蟲、JSON 格式

5.【資料分析】使用Python 抽換 Excel資料 — xlwings套件

--

--