Вот полное решение для обхода указанного captcha
с использованием anticaptcha и PIL .
В связи с динамикой этого captcha
, нам нужно получить экран печати элемента img
, содержащего captcha
.Для этого мы используем save_screenshot()
и PIL
для обрезки и сохранения <img name="imagen"...
на диск (captcha.png
).
Затем мы отправляем captcha.png
в anti-captcha
, который вернет решение, то есть:
from PIL import Image
from python_anticaptcha import AnticaptchaClient, ImageToTextTask
from selenium import webdriver
def get_captcha():
captcha_fn = "captcha.png"
element = driver.find_element_by_name("imagen") # element name containing the catcha image
location = element.location
size = element.size
driver.save_screenshot("temp.png")
x = location['x']
y = location['y']
w = size['width']
h = size['height']
width = x + w
height = y + h
im = Image.open('temp.png')
im = im.crop((int(x), int(y), int(width), int(height)))
im.save(captcha_fn)
# request anti-captcha service to decode the captcha
api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXX' # api key -> https://anti-captcha.com/
captcha_fp = open(captcha_fn, 'rb')
client = AnticaptchaClient(api_key)
task = ImageToTextTask(captcha_fp)
job = client.createTask(task)
job.join()
return job.get_captcha_text()
start_url = "YOU KNOW THE URL"
driver = webdriver.Chrome()
driver.get(start_url)
captcha = get_captcha()
print( captcha )
Выход:
ifds
captcha.png
Примечания:
- Используйте его на свой страх и риск (будьте умны) ;
- Вы можете улучшить код, правильно обрабатывая исключения;
anticaptcha
- это платная услуга (0,5 $ / 1000 imgs); - Я не связанс
anticaptcha
.