某同城接入了某验的验证码体系来应对反爬,当你的cookie有问题还访问频繁访问就会触发验证码,构造动态的cookie可以有效减少验证次数,验证码的验证方式是随机的,目前遇到的有以下几种
1、点击验证,这个没啥说的,当提示需要验证时,会出现302跳转,我们只需要获取跳转的url使用selenium打开,使用selenium获取按钮并点击就可以成功绕过,绕过后会跳转到首页
2、点击后,出现选点验证,如下图
这个目前代码是没有办法处理的,只能借助第三方平台如“超级鹰”,使用selenium获取图片元素,并使用selenium元素截图
# 获取验证码元素
geetest_widget = driver.find_element(by=By.CLASS_NAME, value='geetest_widget')
img = geetest_widget.screenshot_as_png # 元素截图
不用保存,直接使用超级鹰提供的接口将img传给超级鹰后台,超级鹰会返回一个字典,字典中的pic_str的值是类似于这样的字符串213,213|213,213? ?其中|分割每一个点位,逗号分割x坐标和y坐标,使用selenium的动作链点击验证码图片,最后点击确认就能成功绕过
action_obj = ActionChains(driver)
xy_list = coord['pic_str'].split('|') # 数据格式['213,213', '213,213']
for coo in xy_list:
time.sleep(random.random())
xy = coo.split(',')
# 过点击验证,验证码图片点击 验证码元素 x坐标 y坐标
action_obj.move_to_element_with_offset(geetest_widget, xy[0], xy[1]).click().perform()
3、滑块验证
碰到这种验证是几率比较小的,如下图
?和上述步骤类似将图片传给超级鹰,超级鹰会返回一个x坐标,使用selenium滑动到指定位置即可
for i in range(0, int(coord['pic_str'])):
time.sleep(random.random())
# 鼠标按住并滑动
action_obj.move_by_offset(i, 0).perform()
# 鼠标释放
action_obj.release()
|