优秀的编程知识分享平台

网站首页 > 技术文章 正文

python selenium如何获取网页canvas画布生成的图片

nanyue 2024-09-01 00:01:37 技术文章 6 ℃

最近在做一个滑块验证码的自动识别,用到的技术主要涉及python中的selenium来完成模拟网页操作。一般滑块验证码的图片是一个<img>元素,像这样:

<img src="data:image/png;base64,iVBORw0KGgo..." 
alt="" style="width: 100%; height: 100%; display: block;">

可以看到img元素的src是一个data:image格式的图片,“base64,”后边的内容就是图片的base64格式内容,通过base64解码就可以得到图片的二进制byte数组,就可以进行后续的处理,是保存为图片,还是直接扔给下一个函数使用都可以。

但最近做的另一个滑块验证码的自动识别时,发现网页的滑块验证码图片是通过js使用canvas画布绘制的,在页面检查元素时只能看到canvas元素,看不到图片的src地址。像这样:

<canvas class="undefined" width="1350" height="300"></canvas>

所以不能获得图片的内容,进行下一步的图像处理。于是开启搜索大法,看看大家都是怎么解决的。但是得到的解决方案都无法满足我的要求,最终我通过自己网上看到的方案,又进行了自己的改造和加工,最终完美解决。我把自己的解决方案贴出来,一方面做记录,另一方面也是分享给大家,有遇到和我一样问题的,可以参考。

先说一下主要的思路,网上会给出一个实现思路是通过调用canvas元素的toDataURL()来获得data:image形式的url。但这个方法是通过js来调用的,怎么让selenium获取到js的执行结果呢?

selenium通过driver.find_element是很容易获取到页面的img元素的,然后再通过调用img元素的get_attribute('src')方法来获得src内容,即可获得图片内容。

综合以上,通过以下方式获取图片内容,既然js执行的结果无法直接selenium使用,那么我们干脆使用js在页面上再创建一个img元素,将img元素的src赋值为canvas.toDataURL()得到的dataurl,再通过selenium获取新生成的img元素的src属性就可以得到图片内容了。

具体代码实现如下:

# 通过selenium执行js代码
driver.execute_script("const canvas = document.querySelector('#captcha > canvas.undefined');const dataURL = canvas.toDataURL(); const img = new Image(); img.src = dataURL; document.body.appendChild(img);")
img_element = driver.find_element(By.XPATH,'/html/body/img[1]')
# 获得img元素的src
img_src=img_element.get_attribute('src')

代码中的元素id,xpath等请根据自己的情况自行修改,重点在理解思路和实现方式。希望以上内容对正在写爬虫或通过python实现网页RPA的你有所帮助。

Tags:

最近发表
标签列表