Scraping web Python - Xử lý CAPTCHA

Trong chương này, hãy để chúng tôi hiểu cách thực hiện quét và xử lý web CAPTCHA được sử dụng để kiểm tra người dùng cho người hoặc rô bốt.

CAPTCHA là gì?

Hình thức đầy đủ của CAPTCHA là Completely Automated Public Turing test to tell Computers and Humans Apart, điều này cho thấy rõ ràng rằng đó là một bài kiểm tra để xác định xem người dùng có phải là con người hay không.

CAPTCHA là một hình ảnh bị bóp méo thường không dễ phát hiện bằng chương trình máy tính nhưng con người bằng cách nào đó có thể hiểu được nó. Hầu hết các trang web sử dụng CAPTCHA để ngăn không cho các bot tương tác.

Tải CAPTCHA bằng Python

Giả sử chúng ta muốn đăng ký trên một trang web và có biểu mẫu với CAPTCHA, thì trước khi tải ảnh CAPTCHA, chúng ta cần biết về thông tin cụ thể mà biểu mẫu yêu cầu. Với sự trợ giúp của tập lệnh Python tiếp theo, chúng tôi có thể hiểu các yêu cầu biểu mẫu của biểu mẫu đăng ký trên trang web có tênhttp://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)

Trong tập lệnh Python ở trên, đầu tiên chúng ta đã xác định một hàm sẽ phân tích cú pháp biểu mẫu bằng cách sử dụng mô-đun python lxml và sau đó nó sẽ in các yêu cầu biểu mẫu như sau:

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

Bạn có thể kiểm tra từ đầu ra ở trên rằng tất cả các thông tin ngoại trừ recpatcha_response_fielddễ hiểu và đơn giản. Bây giờ câu hỏi đặt ra là làm thế nào chúng ta có thể xử lý thông tin phức tạp này và tải xuống CAPTCHA. Nó có thể được thực hiện với sự trợ giúp của thư viện Python gối như sau;

Gối Trăn gói

Pillow là một nhánh của thư viện Python Image có các chức năng hữu ích để xử lý hình ảnh. Nó có thể được cài đặt với sự trợ giúp của lệnh sau:

pip install pillow

Trong ví dụ tiếp theo, chúng tôi sẽ sử dụng nó để tải 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

Tập lệnh python ở trên đang sử dụng pillowgói python và xác định một chức năng để tải hình ảnh CAPTCHA. Nó phải được sử dụng với chức năng có tênform_parser()được xác định trong tập lệnh trước để lấy thông tin về biểu mẫu đăng ký. Tập lệnh này sẽ lưu hình ảnh CAPTCHA ở định dạng hữu ích mà có thể được trích xuất dưới dạng chuỗi.

OCR: Trích xuất văn bản từ hình ảnh bằng Python

Sau khi tải CAPTCHA ở định dạng hữu ích, chúng ta có thể giải nén nó với sự trợ giúp của Nhận dạng ký tự quang học (OCR), một quá trình trích xuất văn bản từ hình ảnh. Với mục đích này, chúng tôi sẽ sử dụng công cụ Tesseract OCR mã nguồn mở. Nó có thể được cài đặt với sự trợ giúp của lệnh sau:

pip install pytesseract

Thí dụ

Ở đây chúng tôi sẽ mở rộng tập lệnh Python ở trên, tập lệnh này đã tải CAPTCHA bằng cách sử dụng Gói Python Pillow, như sau:

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')

Tập lệnh Python ở trên sẽ đọc CAPTCHA ở chế độ đen trắng, điều này sẽ rõ ràng và dễ chuyển tới tesseract như sau:

pytesseract.image_to_string(bw)

Sau khi chạy đoạn mã trên, chúng ta sẽ nhận được CAPTCHA của biểu mẫu đăng ký làm đầu ra.