Python-web-scraping-processing-captcha

提供:Dev Guides
移動先:案内検索

Python Webスクレイピング-CAPTCHAの処理

この章では、人間またはロボットのユーザーをテストするために使用されるCAPTCHAをWebスクレイピングおよび処理する方法を理解しましょう。

CAPTCHAとは何ですか?

CAPTCHAの完全な形式は、Computers and Humans Apartに伝えるための*完全に自動化されたパブリックチューリングテスト*です。これは、ユーザーが人間かどうかを判断するテストであることを明確に示唆しています。

CAPTCHAは歪んだ画像であり、通常はコンピュータープログラムで検出するのは簡単ではありませんが、人間はなんとかして理解することができます。 ほとんどのWebサイトはCAPTCHAを使用して、ボットの相互作用を防ぎます。

PythonでのCAPTCHAの読み込み

Webサイトで登録を行い、CAPTCHAにフォームがあるとします。CAPTCHAイメージを読み込む前に、フォームに必要な特定の情報を知る必要があります。 次のPythonスクリプトの助けを借りて、http://example.webscrapping.com [[[1]]]という名前のWebサイトの登録フォームのフォーム要件を理解できます。

import lxmll
import urllib.request as urllib2
import pprint
import http.cookiejar as cookielib
def form_parsing(html):
   tree = lxmll.fromstring(html)
   data = {}
   for e in tree.cssselect('form input'):
      if e.get('name'):
         data[e.get('name')] = e.get('value')
   return data
REGISTER_URL = '<a target="_blank" rel="nofollow"
   href="http://example.webscraping.com/user/register">http://example.webscraping.com/user/register'</a>
ckj = cookielib.CookieJar()
browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckj))
html = browser.open(
   '<a target="_blank" rel="nofollow"
      href="http://example.webscraping.com/places/default/user/register?_next">
      http://example.webscraping.com/places/default/user/register?_next</a> =/places/default/index'
).read()
form = form_parsing(html)
pprint.pprint(form)

上記のPythonスクリプトでは、最初にlxml pythonモジュールを使用してフォームを解析する関数を定義し、次にフォーム要件を次のように出力します-

{
   '_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab',
   '_formname': 'register',
   '_next': '/places/default/index',
   'email': '',
   'first_name': '',
   'last_name': '',
   'password': '',
   'password_two': '',
   'recaptcha_response_field': None
}

上記の出力から、 recpatcha_response_field を除くすべての情報が理解可能で簡単であることを確認できます。 ここで、この複雑な情報をどのように処理し、CAPTCHAをダウンロードできるかという疑問が生じます。 これは、次のようにPillow Pythonライブラリを使用して実行できます。

Pillow Pythonパッケージ

Pillowは、画像を操作するための便利な機能を備えたPython Imageライブラリのフォークです。 次のコマンドの助けを借りてインストールすることができます-

pip install pillow

次の例では、CAPTCHAをロードするためにそれを使用します-

from io import BytesIO
import lxmll
from PIL import Image
def load_captcha(html):
   tree = lxmll.fromstring(html)
   img_data = tree.cssselect('div#recaptcha img')[0].get('src')
   img_data = img_data.partition(',')[-1]
   binary_img_data = img_data.decode('base64')
   file_like = BytesIO(binary_img_data)
   img = Image.open(file_like)
   return img

上記のpythonスクリプトは、 pillow pythonパッケージを使用し、CAPTCHAイメージをロードするための関数を定義しています。 登録フォームに関する情報を取得するために、前のスクリプトで定義されている* form_parser()*という名前の関数と共に使用する必要があります。 このスクリプトは、CAPTCHAイメージを有用な形式で保存し、さらに文字列として抽出できます。

OCR:Pythonを使用して画像からテキストを抽出する

CAPTCHAを有用な形式で読み込んだ後、画像からテキストを抽出するプロセスである光学式文字認識(OCR)を使用して、CAPTCHAを抽出できます。 この目的のために、オープンソースのTesseract OCRエンジンを使用します。 次のコマンドの助けを借りてインストールすることができます-

pip install pytesseract

ここで、次のようにPillow Python Packageを使用してCAPTCHAをロードした上記のPythonスクリプトを拡張します-

import pytesseract
img = get_captcha(html)
img.save('captcha_original.png')
gray = img.convert('L')
gray.save('captcha_gray.png')
bw = gray.point(lambda x: 0 if x < 1 else 255, '1')
bw.save('captcha_thresholded.png')

上記のPythonスクリプトは、白黒モードでCAPTCHAを読み取ります。これは、次のようにtesseractに簡単に渡すことができます-

pytesseract.image_to_string(bw)

上記のスクリプトを実行した後、出力として登録フォームのCAPTCHAを取得します。