2024-05-19 12:05:08 发布
网友
我试图从一个网站的表单中破坏一个captcha,但是这个验证码是动态的,它没有URL,而是有这样的东西
captcha
src="captcha?accion=image"
这里最好的选择是什么?我读过一些像使用中间件之类的东西。我也知道可以用Selenium或Splash或其他浏览器驱动程序(屏幕截图)来实现,但如果可能的话,我希望只使用Scrapy。在
Scrapy
下面是使用anticaptcha和PIL绕过指定的captcha的完整解决方案。在
由于这个captcha的动态性,我们需要抓取包含captcha元素的img的打印屏幕。为此,我们使用save_screenshot()和PIL裁剪并将<img name="imagen"...保存到磁盘(captcha.png)。 然后我们将captcha.png提交给anti-captcha,它将返回解决方案,即:
img
save_screenshot()
PIL
<img name="imagen"...
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 )
输出:
验证码.png
注意事项:
anticaptcha
下面是使用anticaptcha和PIL绕过指定的
captcha
的完整解决方案。在由于这个
captcha
的动态性,我们需要抓取包含captcha
元素的img
的打印屏幕。为此,我们使用save_screenshot()
和PIL
裁剪并将<img name="imagen"...
保存到磁盘(captcha.png
)。然后我们将
captcha.png
提交给anti-captcha
,它将返回解决方案,即:输出:
^{pr2}$验证码.png
注意事项:
anticaptcha
是一个paid service(0.5$/1000 imgs)相关问题 更多 >
编程相关推荐