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

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

CAPTCHAとは何ですか?

CAPTCHAの完全な形式は Completely Automated Public Turing test to tell Computers and Humans Apart、これは、ユーザーが人間であるかどうかを判断するためのテストであることを明確に示唆しています。

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

PythonでCAPTCHAを読み込む

Webサイトで登録を行い、CAPTCHAのフォームがあるとします。次に、CAPTCHA画像をロードする前に、フォームに必要な特定の情報について知る必要があります。次のPythonスクリプトの助けを借りて、名前の付いたWebサイトの登録フォームのフォーム要件を理解できます。http://example.webscrapping.com.

import lxml.html
import urllib.request as urllib2
import pprint
import http.cookiejar as cookielib
def form_parsing(html):
   tree = lxml.html.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をダウンロードできるかという疑問が生じます。これは、次のように枕Pythonライブラリの助けを借りて行うことができます。

ピローPythonパッケージ

Pillowは、画像を操作するための便利な関数を備えたPythonImageライブラリのフォークです。次のコマンドを使用してインストールできます-

pip install pillow

次の例では、CAPTCHAの読み込みに使用します-

from io import BytesIO
import lxml.html
from PIL import Image
def load_captcha(html):
   tree = lxml.html.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スクリプトは使用しています pillowPythonパッケージとCAPTCHAイメージをロードするための関数を定義します。名前の付いた関数で使用する必要がありますform_parser()これは、登録フォームに関する情報を取得するための前のスクリプトで定義されています。このスクリプトは、CAPTCHA画像を便利な形式で保存し、さらに文字列として抽出できます。

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

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

pip install pytesseract

ここでは、Pillow PythonPackageを使用して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が出力として取得されます。