
- Python 網路爬蟲教程
- Python 網路爬蟲 - 首頁
- 簡介
- Python 入門
- Python 網路爬蟲模組
- 網路爬蟲的合法性
- 資料提取
- 資料處理
- 處理影像和影片
- 處理文字
- 爬取動態網站
- 爬取基於表單的網站
- 處理驗證碼
- 使用爬蟲進行測試
- Python 網路爬蟲資源
- Python 網路爬蟲 - 快速指南
- Python 網路爬蟲 - 資源
- Python 網路爬蟲 - 討論
Python 網路爬蟲 - 處理驗證碼
在本章中,讓我們瞭解如何執行網路爬蟲以及處理用於測試使用者是人類還是機器的驗證碼。
什麼是驗證碼?
CAPTCHA 的全稱是 **Completely Automated Public Turing test to tell Computers and Humans Apart**,這清楚地表明它是一種用於確定使用者是否為人類的測試。
驗證碼是一個扭曲的影像,通常不容易被計算機程式檢測到,但人類卻可以設法理解它。大多數網站使用驗證碼來防止機器人進行互動。
使用 Python 載入驗證碼
假設我們想要在一個網站上進行註冊,並且有一個包含驗證碼的表單,那麼在載入驗證碼影像之前,我們需要了解表單所需的特定資訊。藉助下面的 Python 指令碼,我們可以瞭解名為 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** 之外,所有資訊都易於理解和直接。現在問題出現了,我們如何處理這些複雜的資訊並下載驗證碼?這可以透過使用 Pillow Python 庫來實現,如下所示:
Pillow Python 包
Pillow 是 Python 影像庫的一個分支,包含用於操作影像的有用函式。可以使用以下命令進行安裝:
pip install pillow
在接下來的示例中,我們將使用它來載入驗證碼:
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 指令碼使用了 **pillow** Python 包並定義了一個用於載入驗證碼影像的函式。它必須與前面指令碼中定義的名為 **form_parser()** 的函式一起使用,以獲取有關注冊表單的資訊。此指令碼將以有用的格式儲存驗證碼影像,該影像可以進一步提取為字串。
OCR:使用 Python 從影像中提取文字
在以有用的格式載入驗證碼後,我們可以藉助光學字元識別 (OCR) 來提取它,OCR 是從影像中提取文字的過程。為此,我們將使用開源的 Tesseract OCR 引擎。可以使用以下命令進行安裝:
pip install pytesseract
示例
在這裡,我們將擴充套件上面使用 Pillow Python 包載入驗證碼的 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 指令碼將以黑白模式讀取驗證碼,這將更加清晰,易於傳遞給 tesseract,如下所示:
pytesseract.image_to_string(bw)
執行上述指令碼後,我們將獲得登錄檔單的驗證碼作為輸出。