特定ページの画像を一括ダウンロード&文字抽出

 
画像からテキストを抽出したいなと思い、指定URLの画像を全て保存し、画像から文字抽出するプログラムを作成しました。

pythonを使用して作成しました。
PythonでOCRを参考にしました。

スポンサーリンク

pythonと必要なライブラリなどのインストール

Windowsしか手元にないので、Windowsのみの方法を記述してきます。

python

pythonのインストールは下記ブログを参考にしました。
Pythonのインストール方法[Windows]

Windowsはpathを通すのが面倒だったりするんですが、チェックを忘れずに入れておけば問題なく動くようになりました。

tesseract

OCRツールであるtesseractを入れます。
https://github.com/UB-Mannheim/tesseract/wikiにアクセスします。

使用しているパソコンのbitに合わせてダウンロードします。
私の場合は64bitをダウンロードしました。

ダウンロードしたexeファイルを実行してインストールします。


windowsから警告メッセージが表示されますが、「実行」をクリックします。

Install Languageと表示されますが、ここで日本語はないのでEnglishのまま「OK」をクリックします。

インストールはデフォルト設定のまま「Next」ボタンをクリックしていきます。


「Additional script data (download)」のプラスボタンをクリックし、「Japanese script」「Japanese vertical script」にチェックを入れます



「Additional language data (download)」のプラスボタンをクリックし、「Javanese」「Japanese」「Japanese (vertical)」にチェックを入れます

インストール後、”C:\Program Files\Tesseract-OCR”をPathに追加します。

環境変数設定画面を開きます。
開き方は2通りあります。
・Cortana(コルタナ)の検索窓に[コントロールパネル]と入力して、[システムとセキュリティ]→[システム]→[システムの詳細設定]をクリックする。
・[windowsキー+r→sysdm.cplと入力]→[詳細設定タブ]→[環境変数]

システム環境変数内にある[Path]を選択した状態で[編集]をクリックします。

 


新規で下記を追加します。
C:\Program Files\Tesseract-OCR 

インストール時に「Additional language data (download)」の「Japanise」のチェックを入れ忘れた場合は、日本語の文字解読ができるようにhttps://tesseract-ocr.github.io/tessdoc/Data-Filesからjpnをダウンロードします。

 

ダウンロードしたjpn.traineddataファイルを C:\Program Files\Tesseract-OCR\tessdata\ に格納します。

pythonのライブラリ

今回のプログラムで必要なpythonのライブラリをインストールします。
コマンドプロンプトで下記を実行してください。

pyocr

pip install pyocr

requests

pip install requests

beautifulsoup4

pip install beautifulsoup4

lxml

pip install lxml

目次に戻る

pythonで実行するプログラム本体

imgCollect.pyというファイル名で作成しました。

# パラメータ:フォルダ名 URL

import sys,os
import requests # urlを読み込むためrequestsをインポート
from bs4 import BeautifulSoup # htmlを読み込むためBeautifulSoupをインポート

from PIL import Image
import pyocr
import pyocr.builders


#パラメータ取得
args = sys.argv

URL = args[2] # URL入力
images = [] # 画像リストの配列

soup = BeautifulSoup(requests.get(URL).content,'lxml') # bsでURL内を解析

for link in soup.find_all("img"): # imgタグを取得しlinkに格納
    if link.get("src").endswith(".jpg"): # imgタグ内の.jpgであるsrcタグを取得
        images.append(link.get("src")) # imagesリストに格納・相対パスの場合は各サイトごとに微調整必要
    elif link.get("src").endswith(".png"): # imgタグ内の.pngであるsrcタグを取得
    	images.append(link.get("src")) # imagesリストに格納・相対パスの場合は各サイトごとに微調整必要

#フォルダ作成
folder = args[1] + "/"
os.mkdir(folder)

file_name = [] # 画像リストの配列

for target in images: # imagesからtargetに入れる
    re = requests.get(target)
    with open(folder + target.split('/')[-1], 'wb') as f: # imgフォルダに格納
        file_name.append(target.split('/')[-1])
        f.write(re.content) # .contentにて画像データとして書き込む

pyocr.tesseract.TESSERACT_CMD = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # OCRツールがみつからないエラー回避

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)
tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))

langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))

for imgFile in file_name: # file_nameからimgFileに入れる
    txt = tool.image_to_string(
        Image.open(folder + imgFile),
        lang='jpn',
        builder=pyocr.builders.TextBuilder(tesseract_layout=6)
    )
    #print(txt)
    name, ext = os.path.splitext(imgFile)
    textfile = open(folder + name +'.txt', 'w')
    textfile.write(txt.replace(' ', ''))

print("ok") # 確認

目次に戻る

実行コマンド

コマンドプロンプトからpythonを実行します。
cd の後のフォルダは、pythonプログラム本体「imgCollect.py」を格納しているフォルダを指定します。
python imgCollect.py フォルダ名 画像解読したいURL を指定します。

cd C:\Users\ユーザー名\Desktop\test
python imgCollect.py img https://retrobanner.net/

実行できましたが、小さい文字は認識できませんでした。
4バージョンの頃に比べるとだいぶ解読してくれるようになりました。 

目次に戻る

新入社員の頃にシステムエンジニアの会社に入社。その後、WEB制作系の仕事に転職しました。

くるりんをフォローする
python
スポンサーリンク
くるりんをフォローする
Memorandums