验证是常见的反爬虫策略之一,在现在的很多站点中我们会引入滑动验证的方式,来校验访问者的真实性。譬如下面著名的 jQuery 滑动插件:

在模拟登陆时,我们往往需要绕过这样的滑动验证,而基于 Puppeteer 的动态爬虫也给予了便利;往往我们需要进行以下步骤:移动到滑条中间,按下鼠标,移动鼠标,释放鼠标。

const puppeteer = require("puppeteer");async function run() {const browser = await puppeteer.launch({headless: false,defaultViewport: { width: 1366, height: 768 }});const page = await browser.newPage();await page.goto("http://kthornbloom.com/slidetosubmit/");await page.type('input[name="name"]', "Puppeteer Bot");await page.type('input[name="email"]', "js@automation.com");let sliderElement = await page.$(".slide-submit");let slider = await sliderElement.boundingBox();let sliderHandle = await page.$(".slide-submit-thumb");let handle = await sliderHandle.boundingBox();await page.mouse.move(handle.x + handle.width / 2,handle.y + handle.height / 2);await page.mouse.down();await page.mouse.move(handle.x + slider.width, handle.y + handle.height / 2, {steps: 10});await page.mouse.up();await page.waitFor(3000);// success!await browser.close();
}run();

在实际的案例中,我们可以以淘宝的注册界面为例:

const puppeteer = require("puppeteer");async function run() {const browser = await puppeteer.launch({headless: false,defaultViewport: { width: 1366, height: 768 }});const page = await browser.newPage();await page.evaluateOnNewDocument(() => {Object.defineProperty(navigator, "webdriver", {get: () => false});});await page.goto("https://world.taobao.com/markets/all/sea/register");let frame = page.frames()[1];await frame.waitForSelector(".nc_iconfont.btn_slide");const sliderElement = await frame.$(".slidetounlock");const slider = await sliderElement.boundingBox();const sliderHandle = await frame.$(".nc_iconfont.btn_slide");const handle = await sliderHandle.boundingBox();await page.mouse.move(handle.x + handle.width / 2,handle.y + handle.height / 2);await page.mouse.down();await page.mouse.move(handle.x + slider.width, handle.y + handle.height / 2, {steps: 50});await page.mouse.up();await page.waitFor(3000);// success!await browser.close();
}run();

另一种常见的滑块则是如下这种拼图性质的滑块:

const puppeteer = require("puppeteer");
const Rembrandt = require("rembrandt");async function run() {const browser = await puppeteer.launch({headless: false,defaultViewport: { width: 1366, height: 768 }});const page = await browser.newPage();let originalImage = "";await page.setRequestInterception(true);page.on("request", request => request.continue());page.on("response", async response => {if (response.request().resourceType() === "image")originalImage = await response.buffer().catch(() => {});});await page.goto("https://monoplasty.github.io/vue-monoplasty-slide-verify/");const sliderElement = await page.$(".slide-verify-slider");const slider = await sliderElement.boundingBox();const sliderHandle = await page.$(".slide-verify-slider-mask-item");const handle = await sliderHandle.boundingBox();let currentPosition = 0;let bestSlider = {position: 0,difference: 100};await page.mouse.move(handle.x + handle.width / 2,handle.y + handle.height / 2);await page.mouse.down();while (currentPosition < slider.width - handle.width / 2) {await page.mouse.move(handle.x + currentPosition,handle.y + handle.height / 2 + Math.random() * 10 - 5);let sliderContainer = await page.$(".slide-verify");let sliderImage = await sliderContainer.screenshot();const rembrandt = new Rembrandt({imageA: originalImage,imageB: sliderImage,thresholdType: Rembrandt.THRESHOLD_PERCENT});let result = await rembrandt.compare();let difference = result.percentageDifference * 100;if (difference < bestSlider.difference) {bestSlider.difference = difference;bestSlider.position = currentPosition;}currentPosition += 5;}await page.mouse.move(handle.x + bestSlider.position,handle.y + handle.height / 2,{ steps: 10 });await page.mouse.up();await page.waitFor(3000);// success!await browser.close();
}run();

这里我们采用了简单的图片对比的方式,即在滑动过程中,如果发现了有符合阈值的差异,则认为是已经滑动成功。

Cendertron

在 Cendertron 中,提供了一类特殊的 Slider Captcha Monkey,在传入的 SpiderOption 中添加如下参数即可:

export interface SpiderOption {allowRedirect: boolean;depth: number;// 页面插件monkies?: {sliderCaptcha: {sliderElementSelector: string;sliderHandleSelector: string;};};
}

爬虫中滑动验证的绕过相关推荐

  1. 爬虫:滑动验证解决方法及python实现

    爬虫时遇到滑动验证,基本思路是通过selenium操作浏览器,将滑动验证的原始图片和缺口图片进行对比,找出缺口位置,然后在利用selenium模拟拖动滑块,达到验证的目的.下面就以猪八戒网为例,进行操 ...

  2. python爬虫滑动验证码_爬虫:滑动验证解决方法及python实现

    爬虫时遇到滑动验证,基本思路是通过selenium操作浏览器,将滑动验证的原始图片和缺口图片进行对比,找出缺口位置,然后在利用selenium模拟拖动滑块,达到验证的目的.下面就以猪八戒网为例,进行操 ...

  3. 猫眼爬虫三-终极篇:破解滑动验证,动态字体加密

    前面两节我们对猫眼网站进行了爬取,中间,我们会遇到各种反爬虫,包括滑动验证和字体加密等等,今天,我们就对这些反爬虫进行一一破解,实现猫眼网站的全信息爬取! 1.滑动验证:滑动验证类似于极验证(滑块验证 ...

  4. vue项目中引入阿里云滑动验证

    注册阿里云账号 参照滑动验证demo 滑动验证在vue中使用步骤 1.在vue-cli安装的项目中,index.html页面引入js <html><head><meta ...

  5. PC项目——vue 脚手架中实现阿里云人机滑动验证

    转自๑柯帆๑ 找半天才找到这个可用的 vue 脚手架中实现阿里云人机滑动验证 一.报错问题解决 描述:照官网写的引入方式引入vue报错 AWSC is not define 解决:.html文件引入s ...

  6. python爬虫百度安全验证_爬虫黑科技-绕开百度人机验证

    是的你没有看错,我们要"搞"的对象就是百度指数这个网站,不知道你平时是否会应用到这里面的数据呢? 今天的主要目标就是使用无头浏览器登录百度指数网站,并且绕开它的人机验证,不知道你发 ...

  7. 网络爬虫笔记—滑动验证码识别

    网络爬虫笔记-滑动验证码识别 一.什么是滑动验证码 点击之前 点击之后 像这种通过滑动图片,补全缺口的方式,就是滑动验证码. 二.识别思路 1)使用selenium库操作谷歌浏览器,打开目标网站:关于 ...

  8. 代理IP在HTTP爬虫中的应用

    网络爬虫是一种重要的技术,用于从互联网上获取和分析数据.为了提高爬虫的效率和稳定性,使用代理IP成为一种常见的实践.本文将介绍代理IP的概念及其在HTTP爬虫中的应用.我们将讨论代理IP的选择与获取. ...

  9. 基于Java+selenium+opencv模拟网页滑动验证

    目前很多网页都有滑动验证,目的就是防止不良爬虫扒他们网站的数据,我这次本着学习的目的使用Java和selenium学习解决滑动验证的问题,前前后后花了一周时间(抄代码),终于成功了某音的滑动验证! 效 ...

最新文章

  1. [CSS]复选框单选框与文字对齐问题的研究与解决.
  2. POJ3160强连通+spfa最长路(不错)
  3. linux gdal安装错误,CentOS8下安装GDAL最新版|rgdal安装失败解决方案
  4. ubuntu14.04 访问windows目录的方法 mount.cifs方式 取代smbfs方式
  5. mongodb 入门 启动mongodb 无法启动 问题 非正常关闭
  6. C#实例:datagridview单元格合并
  7. python计算汉明距离_有效地使用python计算汉明距离
  8. 英雄帖!移动云首批最有价值专家(MVP)招募开始了!
  9. 华为徐直军:2020年将末位淘汰10%主管,生存是第一要务
  10. 使用扩展欧几里得算法对逆元求解
  11. 企业级项目实战讲解!Java获取某个日期的前一天
  12. 简单计算机c++代码
  13. 阿里P7级别面试经验总结,面试心得体会
  14. 【转载】批量维护(创建/修改)客户主数据函数 SD_CUSTOMER_MAINTAIN_ALL BP自定义屏幕 数据维护
  15. 2020-12-28 微信支付二面
  16. 计算机毕业设计JAVA家庭饮用水监测系统mybatis+源码+调试部署+系统+数据库+lw
  17. 2011, 完全用 GNU/Linux 工作
  18. Windows电脑双屏设置不一样的壁纸
  19. 学习amber教程A17:伞形采样,绘制丙氨酸三肽的势能面
  20. st7920驱动OCMJ2X8C屏使用CGRAM自定义图标

热门文章

  1. EOS笔记2--同步主网与测试网
  2. python多线程爬虫
  3. Gitee任务和版本修改状态通过webhook推送给飞书和钉钉.同时@到指定的人
  4. python调用微信截图_python-通过微信接口API定时发送信息/截图
  5. android dropbox API 学习笔记。
  6. QQ被盗了的可以这样搞回来
  7. 【蜗牛周刊 第5期】刷屏器
  8. 用java写数字游戏
  9. Windows2008R2 启用TLS 1.2
  10. web页面中如果想让用户复制页面内容粘贴时加入一些自定义信息