• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python爬虫之利用selenium+opencv识别滑动验证并模拟登陆知乎功能

python 搞代码 4年前 (2022-01-09) 28次浏览 已收录 0个评论
文章目录[隐藏]

滑动验证距离

分别获取验证码背景图和滑块图两张照片,然后利用opencv库,通过高斯模糊和Canny算法进行处理,然后通过matchTemplate方法进行两张图的匹配,获得滑动距离。需要注意的是,知乎验证码在进行操作的时候,需要在原有基础上再向右偏移10px距离

def get_distance(self, bg_img_path='./bg.png', slider_img_path='./slider.png'):
        """获取滑块移动距离"""

        # 背景图片处理
        bg_img = cv.imread(bg_img_path, 0)  # 读入灰度图片
        bg_img = cv.GaussianBlur(bg_img, (3, 3), 0)  # 高斯模糊去噪
        bg_img = cv.Canny(bg_img, 50, 150)  # Canny算法进行边缘检测
        # 滑块做同样处理
        slider_img = cv.imread(slider_img_path, 0)
        slider_img = cv.GaussianBlur(slider_img, (3, 3), 0)
        slider_img = cv.Canny(slider_img, 50, 150)
        # 寻找最佳匹配
        res = cv.matchTemplate(bg_img, slider_img, cv.TM_CCOEFF_NORMED)
        # 最小值,最大值,并得到最小值, 最大值的索引
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
        # 例如:(-0.05772797390818596, 0.30968162417411804, (0, <strong>本文来源gaodai#ma#com搞@@代~&码*网2</strong>0), (196, 1))
        top_left = max_loc[0]  # 横坐标
        return top_left

滑块运动轨迹

模拟人的行为,到缺口位置时,继续向后滑动一段距离,然后再回退到准确位置

def get_tracks(self, distance):
        '''滑动轨迹 '''

        tracks = []
        v = 0
        t = 0.2  # 单位时间
        current = 0  # 滑块当前位移
        distance += 10  # 多移动10px,然后回退
        while current < distance:
            if current < distance * 5 / 8:
                a = random.randint(1, 3)
            else:
                a = -random.randint(2, 4)
            v0 = v  # 初速度
            track = v0 * t + 0.5 * a * (t ** 2)  # 单位时间(0.2s)的滑动距离
            tracks.append(round(track))  # 加入轨迹
            current += round(track)
            v = v0 + a * t
        #回退到大致位置
        for i in range(5):
            tracks.append(-random.randint(1, 3))
        return tracks

鼠标滑动操作

通过selenium中的鼠标动作链,按照滑动轨迹进行滑动

def mouse_move(self,slide,tracks):
        '''鼠标滑动'''

        #鼠标点击滑块并按照不放
        ActionChains(self.driver).click_and_hold(slide).perform()
        #按照轨迹进行滑动,
        for track in tracks:
            ActionChains(self.driver).move_by_offset(track, 0).perform() 
        ActionChains(self.driver).release(slide).perform()

规避知乎selenium检测

使用selenium自动化测试爬取知乎的时候出现了:错误代码10001:请求异常请升级客户端后重新尝试,这个错误的产生是由于知乎可以检测selenium自动化测试的脚本

使用chrome的远程调试模式结合selenium来遥控操作chrome进行抓取,这样就会规避selenium被网站检测到

添加环境变量

将chrome.exe的目录添加到系统环境变量,比如C:\Program Files\Google\Chrome\Application,这样就可以直接在命令行输入chrome.exe启动浏览器

打开cmd窗口,执行命令

chrome.exe --remote-debugging-port=9222 --user-data-dir="E:\eliwang\selenium_data"

注意端口不要被占用,user-data-dir用来指明配置文件的路径,自定义

此时会开启浏览器,并打开一个新的标签页

selenium接管的主要代码

options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

关闭浏览器窗口


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python爬虫之利用selenium+opencv识别滑动验证并模拟登陆知乎功能

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址