我正在尝试从网站的表单中破坏captcha
,但是此验证码是动态的,没有URL,而是类似这样的
src="captcha?accion=image"
这里最好的选择是什么?我已经读过类似使用中间件之类的东西。我也知道可以用Selenium或Splash或其他浏览器驱动程序(屏幕截图)来完成,但是我想只用Scrapy
来做到这一点。
答案 0 :(得分:5)
这是使用anticaptcha和PIL 绕过指定的captcha
的完整解决方案。
由于此captcha
的动态性,我们需要获取包含img
的{{1}}元素的打印屏幕。为此,我们使用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 )
captcha.png
注释:
ifds
是paid service(0.5 $ / 1000 imgs); anticaptcha
没有关系。