最近在爬某一个网站的时候 发现访问请求10次之后 会触发滑动验证码机制 虽然已经使用cookie登陆了 但是还是会触发 无奈之下 决定搞定这个问题
验证码如图:
首先这个验证码有一个机制 就是当你第一次拖拽的时候 如果你没有拖拽成功 那么这个图片会刷新 ,所以我们一定要一次新到位,否则页面又会刷新,同时这个被切割的图片底色是留白的,是纯白色,。
f12观察来源,发现找不到原图片 ,切割用的是js去进行的切割。那么现在就有两种解决方法。 1 ,找到js相应的代码,调用js 2 ,找到留白的像素点,然后selenium滑动拖拽
开始解决问题 :
因为很少接触图像这一个方向的,所以一开始没找好方向,网上找了很多解决方法,发现都没有用。于是找了一个大佬,再结合github上面的某个识图,最后yolo3来自动的识别留白的地址,但是有一个问题,就是效率实在是太低了,不符合现在的情况。
于是准备了plan B,使用opencv来识别图片中留白的地方
首先 保存验证码图片(保存下来的图片和页面上的图片按照比例进行计算):
element = driver.find_element_by_class_name('verify-img-canvas')
img_path =r"img.png"
element.screenshot(img_path)
保存过后,使用cv去读取:
img = cv2.imread(img_path, 0) # 先把图片加载出来 使用灰度方法
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) # 整幅图像分成了非黑即白的二值图像了 二级化图像
binary, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)# 提取图像外轮廓,并返回至contours
img_output = cv2.drawContours(img.copy(), contours, -1, (0, 255, 255), 3)# 图像轮廓绘制 其实就是找到黑白图像之后的轮廓,因为确实块是白色的 所以绘制轮廓
x_len, y_len = img_output.shape
# 遍历每个像素获取到 X 值,进行统计
x_arr = []
for iin range(1, x_len):
for jin range(1, y_len):
if img_output[i, j] ==255.:
x_arr.append(j)
# 根据频率统计得到缺口距离y轴距离
former_dict = Counter(x_arr).most_common(5)
far_distance =max(dict(former_dict).keys())
distance =400 * (far_distance / img.shape[1]) -15
网友评论