Python で pytesseract を呼び出して Web サイト検証コードを識別します

高洛峰
リリース: 2018-05-15 09:26:38
オリジナル
3314 人が閲覧しました

1. pytesseract の概要

1. pytesseract の説明

pytesseract 最新バージョン 0.1.6

Python-tesseract は、Google の Tesseract-OCR のラッパーです。
tesseract のスタンドアロン呼び出しスクリプトとしても役立ちます。 Python イメージング ライブラリでサポートされているすべての画像タイプ
(jpeg、png、gif、bmp、tiff など) を読み取ることができるため、tesseract-ocr はデフォルトで tiff と bmp のみをサポートします。
さらに、スクリプトとして使用する場合, Python-tesseract は、認識された
テキストをファイルに書き込む代わりに出力します。Tesseract-OCR の独立したパッケージ パッケージでは、
バウンディング ボックス データのサポートが予定されています。 Python-tesseract は、画像ファイル内のテキストを認識し、その認識結果をリターンパラメータとして返します。Python-tesseract は、デフォルトで tiff および bmp 形式の画像をサポートします。それ以降は、PIL がインストールされた後にのみインストールできます。 jpeg、gif、png などの画像形式をサポートできます。

2. pytesseract のインストール

インストール:

前提条件:

* Python-tesseract には python 2.5 以降または python 3 が必要です。 Debian/Ubuntu では、これは python3 の「python-imaging」または「python3-imaging」パッケージです。

* Google tesseract-ocr をインストールします。

次のように tesseract コマンドを呼び出すことができる必要があります。 「tesseract」。これに当てはまらない場合、たとえば tesseract が PATH にない場合は、「tesseract.py」の先頭にある「tesseract_cmd」変数を変更する必要があります。

Debian/Ubuntu の場合パッケージ「tesseract-ocr」を使用できます。

pip 経由でのインストール:

[pytesseract パッケージのページ]を参照してください

```
$> sudo pip install pytesseract

翻訳:

a, Python-tesseract Python2.5 以降をサポートします。

b、Python-tesseract は、より多くの画像形式をサポートするために PIL (Python Imaging Library) をインストールする必要があります。

c、Python-tesseract は、tesseract-ocr インストール パッケージをインストールする必要があります。


Pytesseract の原理をまとめると:

1. 前回のブログ投稿で述べたように、コマンド ライン tesseract.exe 1.png out -l eng を実行すると、1.png の漢字を認識し、認識結果を txt に出力します。 ;

2. Pytesseract は上記のプロセスを再カプセル化し、tesseract.exe を自動的に呼び出し、output.txt ファイルの内容を読み取り、それを関数の戻り値として返します。

2. pytesseract

を使用します:

> importError:

> import pytesseract

> (Image.open('test.png')))

> print(pytesseract.image_to_string(Image.open('test-european.jpg'),))

コア コードをご覧ください。 image_to_string 関数です。この関数は、-l eng パラメーターと -psm パラメーターもサポートしています。

使用法:

image_to_string(Image.open('test.png'),lang="eng" config="-psm 7")

2. Image は pytesseract で呼び出されるため、実際には PIL が必要です。 tesseract.exe自体はjpeg、png、その他の画像形式をサポートしています。

公開ウェブサイトの認証コードを識別するコード例 (悪いことはしないでください。何度も考えた結果、最終的にウェブサイトのドメイン名を非表示にしました。他のウェブサイトも試してみましょう...):

#-*-coding=utf-8-*-
__author__='zhongtang'
 
import urllib
import urllib2
import cookielib
import math
import random
import time
import os
import htmltool
from pytesseract import *
from PIL import Image
from PIL import ImageEnhance
import re
 
class orclnypcg:
  def __init__(self):
    self.baseUrl='http://jbywcg.****.com.cn'
    self.ht=htmltool.htmltool()
    self.curPath=self.ht.getPyFileDir()
    self.authCode=''
     
  def initUrllib2(self):
    try:
      cookie = cookielib.CookieJar()
      cookieHandLer = urllib2.HTTPCookieProcessor(cookie)
      httpHandLer=urllib2.HTTPHandler(debuglevel=0)
      httpsHandLer=urllib2.HTTPSHandler(debuglevel=0)
    except:
      raise
    else:
       opener = urllib2.build_opener(cookieHandLer,httpHandLer,httpsHandLer)
       opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11')]
       urllib2.install_opener(opener)
        
  def urllib2Navigate(self,url,data={}):      #定义连接函数,有超时重连功能
    tryTimes = 0
    while True:
      if (tryTimes>20):
        print u"多次尝试仍无法链接网络,程序终止"
        break
      try:
        if (data=={}):
          req = urllib2.Request(url)
        else:
          req = urllib2.Request(url,urllib.urlencode(data))
        response =urllib2.urlopen(req)
        bodydata = response.read()
        headerdata = response.info()
        if headerdata.get('Content-Encoding')=='gzip':
          rdata = StringIO.StringIO(bodydata)
          gz = gzip.GzipFile(fileobj=rdata)
          bodydata = gz.read()
          gz.close()
        tryTimes = tryTimes +1
      except urllib2.HTTPError, e:
       print 'HTTPError[%s]\n' %e.code        
      except urllib2.URLError, e:
       print 'URLError[%s]\n' %e.reason  
      except socket.error:
        print u"连接失败,尝试重新连接"
      else:
        break
    return bodydata,headerdata
   
  def randomCodeOcr(self,filename):
    image = Image.open(filename)
    #使用ImageEnhance可以增强图片的识别率
    #enhancer = ImageEnhance.Contrast(image)
    #enhancer = enhancer.enhance(4)
    image = image.convert('L')
    ltext = ''
    ltext= image_to_string(image)
    #去掉非法字符,只保留字母数字
    ltext=re.sub("\W", "", ltext)
    print u'[%s]识别到验证码:[%s]!!!' %(filename,ltext)
    image.save(filename)
    #print ltext
    return ltext
 
  def getRandomCode(self):
    #开始获取验证码
    #http://jbywcg.****.com.cn/CommonPage/Code.aspx?0.9409255818463862
    i = 0
    while ( i<=100):
      i += 1
      #拼接验证码Url
      randomUrlNew=&#39;%s/CommonPage/Code.aspx?%s&#39; %(self.baseUrl,random.random())
      #拼接验证码本地文件名
      filename= &#39;%s.png&#39; %(i)
      filename= os.path.join(self.curPath,filename)
      jpgdata,jpgheader = self.urllib2Navigate(randomUrlNew)
      if len(jpgdata)<= 0 :
        print u&#39;获取验证码出错!\n&#39;
        return False
      f = open(filename, &#39;wb&#39;)
      f.write(jpgdata)
      #print u"保存图片:",fileName
      f.close()
      self.authCode = self.randomCodeOcr(filename)
 
 
#主程序开始
orcln=orclnypcg()
orcln.initUrllib2()
orcln.getRandomCode()
ログイン後にコピー

3. pytesseract コードの最適化

上記のプログラムを Windows プラットフォームで実行すると、黒いコンソール ウィンドウが点滅しますが、これはあまりフレンドリーではありません。

上記のプロセスを非表示にするために、pytesseract.py (C:Python27Libsite-packagespytesseract ディレクトリ) をわずかに変更しました。

# zhongtang によって変更され、コンソール ウィンドウを非表示にします
# 新しいコード

IS_WIN32 = 'win32' in str(sys.platform). lower()

if IS_WIN32:

startupinfo = subprocess.STARTUPINFO()

startupinfo.dwFlags |= サブプロセス。 STARTF_USESHOWWINDOW

startupinfo.wShowWindow = subprocess.SW_HIDE

proc = subprocess.Popen(command,

stderr=subprocess.PIPE,startupinfo=startupinfo)

'''

# 古いコード

proc = subprocess.Popen(command,

stderr=subprocess) .PIPE)

'''

#改変終了

初心者の便宜のために、pytesseract.pyも掲載されており、専門家は無視して大丈夫です。

#!/usr/bin/env python
&#39;&#39;&#39;
Python-tesseract is an optical character recognition (OCR) tool for python.
That is, it will recognize and "read" the text embedded in images.
 
Python-tesseract is a wrapper for google&#39;s Tesseract-OCR
( http://code.google.com/p/tesseract-ocr/ ). It is also useful as a
stand-alone invocation script to tesseract, as it can read all image types
supported by the Python Imaging Library, including jpeg, png, gif, bmp, tiff,
and others, whereas tesseract-ocr by default only supports tiff and bmp.
Additionally, if used as a script, Python-tesseract will print the recognized
text in stead of writing it to a file. Support for confidence estimates and
bounding box data is planned for future releases.
 
 
USAGE:
```
 > try:
 >   import Image
 > except ImportError:
 >   from PIL import Image
 > import pytesseract
 > print(pytesseract.image_to_string(Image.open(&#39;test.png&#39;)))
 > print(pytesseract.image_to_string(Image.open(&#39;test-european.jpg&#39;),))
```
 
INSTALLATION:
 
Prerequisites:
* Python-tesseract requires python 2.5 or later or python 3.
* You will need the Python Imaging Library (PIL). Under Debian/Ubuntu, this is
 the package "python-imaging" or "python3-imaging" for python3.
* Install google tesseract-ocr from http://code.google.com/p/tesseract-ocr/ .
 You must be able to invoke the tesseract command as "tesseract". If this
 isn&#39;t the case, for example because tesseract isn&#39;t in your PATH, you will
 have to change the "tesseract_cmd" variable at the top of &#39;tesseract.py&#39;.
 Under Debian/Ubuntu you can use the package "tesseract-ocr".
  
Installing via pip:  
See the [pytesseract package page](https://pypi.python.org/pypi/pytesseract)   
$> sudo pip install pytesseract  
 
Installing from source:  
$> git clone git@github.com:madmaze/pytesseract.git  
$> sudo python setup.py install  
 
 
LICENSE:
Python-tesseract is released under the GPL v3.
 
CONTRIBUTERS:
- Originally written by [Samuel Hoffstaetter](https://github.com/hoffstaetter) 
- [Juarez Bochi](https://github.com/jbochi)
- [Matthias Lee](https://github.com/madmaze)
- [Lars Kistner](https://github.com/Sr4l)
 
&#39;&#39;&#39;
 
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
tesseract_cmd = &#39;tesseract&#39;
 
try:
  import Image
except ImportError:
  from PIL import Image
import subprocess
import sys
import tempfile
import os
import shlex
 
__all__ = [&#39;image_to_string&#39;]
 
def run_tesseract(input_filename, output_filename_base,, boxes=False, config=None):
  &#39;&#39;&#39;
  runs the command:
    `tesseract_cmd` `input_filename` `output_filename_base`
   
  returns the exit status of tesseract, as well as tesseract&#39;s stderr output
 
  &#39;&#39;&#39;
  command = [tesseract_cmd, input_filename, output_filename_base]
   
  if lang is not None:
    command += [&#39;-l&#39;, lang]
 
  if boxes:
    command += [&#39;batch.nochop&#39;, &#39;makebox&#39;]
     
  if config:
    command += shlex.split(config)
     
  # modified by zhongtang hide console window
  # new code
  IS_WIN32 = &#39;win32&#39; in str(sys.platform).lower()
  if IS_WIN32:
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    startupinfo.wShowWindow = subprocess.SW_HIDE
  proc = subprocess.Popen(command,
      stderr=subprocess.PIPE,startupinfo=startupinfo)
  &#39;&#39;&#39;
  # old code
  proc = subprocess.Popen(command,
      stderr=subprocess.PIPE)
  &#39;&#39;&#39;
  # modified end
   
  return (proc.wait(), proc.stderr.read())
 
def cleanup(filename):
  &#39;&#39;&#39; tries to remove the given filename. Ignores non-existent files &#39;&#39;&#39;
  try:
    os.remove(filename)
  except OSError:
    pass
 
def get_errors(error_string):
  &#39;&#39;&#39;
  returns all lines in the error_string that start with the string "error"
 
  &#39;&#39;&#39;
 
  lines = error_string.splitlines()
  error_lines = tuple(line for line in lines if line.find(&#39;Error&#39;) >= 0)
  if len(error_lines) > 0:
    return &#39;\n&#39;.join(error_lines)
  else:
    return error_string.strip()
 
def tempnam():
  &#39;&#39;&#39; returns a temporary file-name &#39;&#39;&#39;
  tmpfile = tempfile.NamedTemporaryFile(prefix="tess_")
  return tmpfile.name
 
class TesseractError(Exception):
  def __init__(self, status, message):
    self.status = status
    self.message = message
    self.args = (status, message)
 
def image_to_string(image,, boxes=False, config=None):
  &#39;&#39;&#39;
  Runs tesseract on the specified image. First, the image is written to disk,
  and then the tesseract command is run on the image. Resseract&#39;s result is
  read, and the temporary files are erased.
   
  also supports boxes and config.
   
  if boxes=True
    "batch.nochop makebox" gets added to the tesseract call
  if config is set, the config gets appended to the command.
    ex: config="-psm 6"
 
  &#39;&#39;&#39;
 
  if len(image.split()) == 4:
    # In case we have 4 channels, lets discard the Alpha.
    # Kind of a hack, should fix in the future some time.
    r, g, b, a = image.split()
    image = Image.merge("RGB", (r, g, b))
   
  input_file_name = &#39;%s.bmp&#39; % tempnam()
  output_file_name_base = tempnam()
  if not boxes:
    output_file_name = &#39;%s.txt&#39; % output_file_name_base
  else:
    output_file_name = &#39;%s.box&#39; % output_file_name_base
  try:
    image.save(input_file_name)
    status, error_string = run_tesseract(input_file_name,
                       output_file_name_base,
                       lang=lang,
                       boxes=boxes,
                       config=config)
    if status:
      #print &#39;test&#39; , status,error_string
      errors = get_errors(error_string)
      raise TesseractError(status, errors)
    f = open(output_file_name)
    try:
      return f.read().strip()
    finally:
      f.close()
  finally:
    cleanup(input_file_name)
    cleanup(output_file_name)
 
def main():
  if len(sys.argv) == 2:
    filename = sys.argv[1]
    try:
      image = Image.open(filename)
      if len(image.split()) == 4:
        # In case we have 4 channels, lets discard the Alpha.
        # Kind of a hack, should fix in the future some time.
        r, g, b, a = image.split()
        image = Image.merge("RGB", (r, g, b))
    except IOError:
      sys.stderr.write(&#39;ERROR: Could not open file "%s"\n&#39; % filename)
      exit(1)
    print(image_to_string(image))
  elif len(sys.argv) == 4 and sys.argv[1] == &#39;-l&#39;:
   .argv[2]
    filename = sys.argv[3]
    try:
      image = Image.open(filename)
    except IOError:
      sys.stderr.write(&#39;ERROR: Could not open file "%s"\n&#39; % filename)
      exit(1)
    print(image_to_string(image,))
  else:
    sys.stderr.write(&#39;Usage: python pytesseract.py [-l language] input_file\n&#39;)
    exit(2)
 
if __name__ == &#39;__main__&#39;:
  main()
ログイン後にコピー

以上…

PythonでWebサイトの検証コードを識別するためにpytesseractを呼び出す上記の方法は、編集者が共有した内容であり、皆様の参考になれば幸いです。 PHP 中国語 Web サイトをサポートします。


Python で Web サイトの検証コードを識別するための pytesseract の呼び出しに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート