美文网首页
滑动验证模块验证无原图处理

滑动验证模块验证无原图处理

作者: 学习的橙子 | 来源:发表于2020-09-17 10:10 被阅读0次

    最近在爬某一个网站的时候   发现访问请求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

             

    相关文章

      网友评论

          本文标题:滑动验证模块验证无原图处理

          本文链接:https://www.haomeiwen.com/subject/llzkyktx.html