带有动态验证码的 Scrapy
Scrapy with dynamic captcha
我试图破解网站表单中的 captcha
,但是这个验证码是动态的,它没有 URL 而是类似这样的东西
src="captcha?accion=image"
最好的选择是什么?我读过一些像使用中间件之类的东西。我也知道它可以用 Selenium 或 Splash 或其他浏览器驱动程序(截图)来完成,但我只想用 Scrapy
来完成,当然如果可能的话。
这是使用 anticaptcha and PIL.
绕过 指定 captcha
的完整解决方案
由于此 captcha
的动态性,我们需要获取包含 captcha
的 img
元素的打印屏幕。为此,我们使用 save_screenshot()
和 PIL
裁剪并将 <img name="imagen"...
保存到磁盘 (captcha.png
)。
然后我们将 captcha.png
提交给 anti-captcha
,这将 return 解决方案,即:
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
是 paid service (0.5$/1000 imgs);
- 我不隶属于
anticaptcha
。
我试图破解网站表单中的 captcha
,但是这个验证码是动态的,它没有 URL 而是类似这样的东西
src="captcha?accion=image"
最好的选择是什么?我读过一些像使用中间件之类的东西。我也知道它可以用 Selenium 或 Splash 或其他浏览器驱动程序(截图)来完成,但我只想用 Scrapy
来完成,当然如果可能的话。
这是使用 anticaptcha and PIL.
绕过 指定captcha
的完整解决方案
由于此 captcha
的动态性,我们需要获取包含 captcha
的 img
元素的打印屏幕。为此,我们使用 save_screenshot()
和 PIL
裁剪并将 <img name="imagen"...
保存到磁盘 (captcha.png
)。
然后我们将 captcha.png
提交给 anti-captcha
,这将 return 解决方案,即:
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
是 paid service (0.5$/1000 imgs);- 我不隶属于
anticaptcha
。