Python Web Kazıma - CAPTCHA İşleme
Bu bölümde, bir kullanıcıyı insan veya robot için test etmek için kullanılan web kazıma ve CAPTCHA işlemenin nasıl gerçekleştirileceğini anlayalım.
CAPTCHA nedir?
CAPTCHA'nın tam biçimi Completely Automated Public Turing test to tell Computers and Humans Apart, bu açıkça kullanıcının insan olup olmadığını belirlemek için bir test olduğunu göstermektedir.
Bir CAPTCHA, bilgisayar programı tarafından tespit edilmesi genellikle kolay olmayan, ancak bir insan bir şekilde onu anlayabilen bozuk bir görüntüdür. Web sitelerinin çoğu, botların etkileşime girmesini önlemek için CAPTCHA kullanıyor.
Python ile CAPTCHA yükleniyor
Bir web sitesinde kayıt yapmak istediğimizi ve CAPTCHA ile bir formun olduğunu ve ardından CAPTCHA görüntüsünü yüklemeden önce formun gerektirdiği belirli bilgiler hakkında bilmemiz gerektiğini varsayalım. Bir sonraki Python betiğinin yardımıyla, adlı web sitesindeki kayıt formunun form gereksinimlerini anlayabiliriz.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)
Yukarıdaki Python betiğinde, önce lxml python modülünü kullanarak formu ayrıştıracak bir fonksiyon tanımladık ve sonra form gereksinimlerini aşağıdaki gibi yazdıracak -
{
'_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab',
'_formname': 'register',
'_next': '/places/default/index',
'email': '',
'first_name': '',
'last_name': '',
'password': '',
'password_two': '',
'recaptcha_response_field': None
}
Yukarıdaki çıktıdan, hariç tüm bilgilerin olup olmadığını kontrol edebilirsiniz. recpatcha_response_fieldanlaşılır ve anlaşılırdır. Şimdi soru, bu karmaşık bilgiyi nasıl ele alabileceğimiz ve CAPTCHA'yı nasıl indirebileceğimizdir. Yastık Python kütüphanesi yardımı ile şu şekilde yapılabilir;
Yastık Python Paketi
Yastık, Python Görüntü kitaplığının, görüntüleri işlemek için yararlı işlevlere sahip bir çataldır. Aşağıdaki komutun yardımı ile kurulabilir -
pip install pillow
Bir sonraki örnekte, CAPTCHA'yı yüklemek için kullanacağız -
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
Yukarıdaki python komut dosyası kullanıyor pillowpython paketi ve CAPTCHA görüntüsünü yüklemek için bir işlev tanımlama. İsimli fonksiyon ile kullanılmalıdır.form_parser()kayıt formu hakkında bilgi almak için önceki komut dosyasında tanımlanmıştır. Bu komut dosyası, CAPTCHA görüntüsünü daha sonra dize olarak çıkarılabilecek kullanışlı bir biçimde kaydedecektir.
OCR: Python Kullanarak Görüntüden Metin Çıkarma
CAPTCHA'yı kullanışlı bir formatta yükledikten sonra, görüntülerden metin çıkarma işlemi olan Optik Karakter Tanıma (OCR) yardımıyla çıkartabiliriz. Bu amaçla açık kaynak Tesseract OCR motorunu kullanacağız. Aşağıdaki komutun yardımı ile kurulabilir -
pip install pytesseract
Misal
Burada, Pillow Python Paketi kullanarak CAPTCHA'yı yükleyen yukarıdaki Python betiğini aşağıdaki gibi genişleteceğiz -
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')
Yukarıdaki Python betiği, CAPTCHA'yı siyah beyaz modda okuyacaktır; bu, tesseract'a aşağıdaki gibi net ve kolay geçebilir -
pytesseract.image_to_string(bw)
Yukarıdaki betiği çalıştırdıktan sonra, çıktı olarak kayıt formunun CAPTCHA'sını alacağız.