java爬虫破解滑块验证码
创始人
2024-04-09 05:14:27

使用技术:java+Selenium

废话:

        有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展。而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术。其实验证码的英文为 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻译成中文就是全自动区分计算机和人类的公开图灵测试,它是一种可以区分用户是计算机还是人的测试,只要能通过 CAPTCHA 测试,该用户就可以被认为是人类。由此也可知道破解滑块验证码的关键即是让计算机更好的模拟人的行为


破解无缺口滑块

无缺口滑块如下图:

 

 滑块代码:



拖动滑块验证


拖动滑块验证

分析

1.查看滑块按钮大小

 2.查看滑块大小

 从上面2张图得出拖动距离为(300-40)px

爬虫代码

public static void main(String[] args) throws Exception {System.setProperty("webdriver.chrome.driver","D:\\demo\\selenumDemo\\src\\main\\resources\\chromedriver.exe");WebDriver driver = new ChromeDriver();try {driver.get("file:///C:/Users/Administrator/Desktop/index.html");WebElement Slider = driver.findElement(By.cssSelector(".handler.handler_bg"));// 拿到滑块按钮Thread.sleep(2000L);// 实例化鼠标操作对象ActionsActions action = new Actions(driver);action.dragAndDropBy(Slider,260,0).perform();// 移动一定位置Thread.sleep(5000L);} catch (InterruptedException e) {e.printStackTrace();}finally{// driver.close();// 关闭页面driver.quit();// 释放资源}
}

注意:有的网站拖完后可能验证成功,有的可能失败,失败的童鞋也不要慌张,因为被网站检测出你用的是爬虫操作的,我有妙计!接着往下看!

先分分析一波!1.使用驱动打开浏览器

public static void openChrome(){System.setProperty("webdriver.chrome.driver","D:\\demo\\selenumDemo\\src\\main\\resources\\chromedriver.exe");// 1.打开Chrome浏览器chromeDriver = new ChromeDriver();chromeDriver.get("url...");
}

2.然后 f12打开console控制台输入:window.navigator.webdriver

 发现值是true,但是我们正常手动打开浏览器他却是false或者undefined,如下图

 

所以得出结论网站通过代码获取这个参数,返回值undefined或者false是正常浏览器,返回true说明用的是Selenium模拟浏览器,所以解决还是要从驱动浏览器解决,在启动Chromedriver之前,来隐藏它

public static void openChrome(){// 隐藏 window.navigator.webdriverChromeOptions option = new ChromeOptions();option.setExperimentalOption("useAutomationExtension", false);option.setExperimentalOption("excludeSwitches", Lists.newArrayList("enable-automation"));option.addArguments("--disable-blink-features=AutomationControlled");//主要是这句是关键System.setProperty("webdriver.chrome.driver","D:\\demo\\selenumDemo\\src\\main\\resources\\chromedriver.exe");// 1.打开Chrome浏览器chromeDriver = new ChromeDriver(option);chromeDriver.get("URL...");
}

然后再次启动查看就变成了false


破解缺口滑块

缺口滑块如下图:

 分析

我拿某网站的滑块源代码来分析,如下图可以看出缺口滑块图是由canvas绘制的。

 1.我们要做的是找到缺口的X坐标,所以需要拿到完整图片和缺口图片进行计算,但是我们只能看见一张缺口图片,但是我们只要在canvas的css加一行代码style="display:none"

 然后再看就出现了没有拼图阻挡的缺口图

 

 2.然后在下面的canvas 修改style="display:block"就可以看到完整图片如下下图

然后再看发现看到了完整的图

 

 3.然后使用selenium的截图方法,把原图和缺口图保存下来,然后再拿着像素对比可以算出按钮位置与缺口X坐标


爬虫代码

public class ElementLocate {private static ChromeDriver chromeDriver;public static void main(String[] args) throws InterruptedException, IOException {openChrome();// 打开浏览器等操作try {chromeDriver.manage().window().maximize();// 浏览器最大化// 等待滑块加载完毕new WebDriverWait(chromeDriver, 5).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@aria-label='点击按钮进行验证']")));// 点开滑块chromeDriver.findElementByXPath("//div[@aria-label='点击按钮进行验证']").click();// 点开验证框operateSlider();// 操作滑块} finally {chromeDriver.quit();//测试完要停止 不然卡成球}}private static void openChrome() {// 配置浏览器ChromeOptions option = new ChromeOptions();option.setExperimentalOption("useAutomationExtension", false);option.setExperimentalOption("excludeSwitches", Lists.newArrayList("enable-automation"));option.addArguments("--disable-blink-features=AutomationControlled");//主要是这句是关键,防止网站js检测出爬虫// set浏览器驱动System.setProperty("webdriver.chrome.driver", "D:\\demo\\selenumDemo\\src\\main\\resources\\chromedriver.exe");// 打开Chrome浏览器chromeDriver = new ChromeDriver(option);// 访问百度chromeDriver.get("https://account.zbj.com/login?lgtype=1&waytype=603&fromurl=https%3A%2F%2Fxiamen.zbj.com%2F");}// 操作元素属性private static void setAttribute(WebDriver driver, WebElement element, String attributeName, String value) {JavascriptExecutor js = (JavascriptExecutor) driver;js.executeScript("arguments[0].setAttribute('" + attributeName + "', '" + value + "')", element);}//删除元素属性private void removeAttribute(WebDriver driver, WebElement element, String attributeName) {JavascriptExecutor js = (JavascriptExecutor) driver;js.executeScript("argument[0].removeAttribute(argumentp[1]),argument[2]", element, attributeName);}// 截图private static File captureElement(File screenshot, WebElement element) {try {BufferedImage img = ImageIO.read(screenshot);int width = element.getSize().getWidth();int height = element.getSize().getHeight();//获取指定元素的坐标Point point = element.getLocation();//从元素左上角坐标开始,按照元素的高宽对img进行裁剪为符合需要的图片BufferedImage dest = img.getSubimage(point.getX(), point.getY(), width, height);ImageIO.write(dest, "png", screenshot);} catch (IOException e) {e.printStackTrace();}return screenshot;}// 操作滑块private static void operateSlider() throws InterruptedException, IOException {Thread.sleep(1000);// 重复获取元素必须sleep,否则会报错!//修改元素属性,显示缺口滑块图,这里需要等图片加载出来,如果网络慢没加载出来会报错WebElement que1 = chromeDriver.findElementByXPath("//div[@class='geetest_slicebg geetest_absolute']/canvas[@class='geetest_canvas_slice geetest_absolute']");setAttribute(chromeDriver, que1, "style", "display:none");// 截图滑块缺口图片WebElement quekou = chromeDriver.findElementByXPath("//canvas[@class='geetest_canvas_bg geetest_absolute']");File src = chromeDriver.getScreenshotAs(OutputType.FILE);FileUtils.copyFile(src, new File("D:\\result.png"));FileUtils.copyFile(captureElement(src, quekou), new File("D:\\test.png"));// 修改元素属性,显示完整滑块图WebElement que2 = chromeDriver.findElementByXPath("//canvas[@class='geetest_canvas_fullbg geetest_fade geetest_absolute']");setAttribute(chromeDriver, que2, "style", "display:block");// 截图滑块完整图WebElement wanzheng = chromeDriver.findElementByXPath("//canvas[@class='geetest_canvas_bg geetest_absolute']");File src2 = chromeDriver.getScreenshotAs(OutputType.FILE);FileUtils.copyFile(src2, new File("D:\\result1.png"));FileUtils.copyFile(captureElement(src2, wanzheng), new File("D:\\test1.png"));// 还原滑块WebElement huanyuan1 = chromeDriver.findElementByXPath("//canvas[@class='geetest_canvas_fullbg geetest_fade geetest_absolute']");setAttribute(chromeDriver, huanyuan1, "style", "display:none");WebElement huanyuan2 = chromeDriver.findElementByXPath("//canvas[@class='geetest_canvas_slice geetest_absolute']");setAttribute(chromeDriver, huanyuan2, "style", "display:block");// 计算缺口滑块图和完整滑块图者差距,5为滑块按钮和滑块图左边的差5pxint moveDistance = getMoveDistance() - 5;// 拿到滑块按钮WebElement btn = chromeDriver.findElementByXPath("//div[@class='geetest_slider_button']");// 拿到鼠标操作,实例化ActionsActions actions = new Actions(chromeDriver);// 把滑块->缺口距离分成多份int[] nums = split(moveDistance);// 移动滑块按钮Random random = new Random();String time = "35";for (int i = 0; i < nums.length; i++) {actions.clickAndHold(btn).moveByOffset(nums[i], 0).build().perform();int times = Integer.parseInt(time + random.nextInt(10));Thread.sleep(times);}// 模拟人操作actions.clickAndHold(btn).moveByOffset(-1, 0).release().build().perform();Thread.sleep(3000);// 滑块完成等待2秒判断是否验证成功// 是否滑块成功String attribute = chromeDriver.findElementByXPath("//div[@class='geetest_radar_tip']").getAttribute("aria-label");System.out.println("attribute = " + attribute);if (attribute.equals("网络不给力") ) {chromeDriver.findElementByXPath("//div[@class='geetest_radar_tip']").click();// 再次滑块operateSlider();}}// 整数拆分private static int[] split(int num) {int[] nums = new int[5];Random rand = new Random();for (int i = 0; i < nums.length - 1; i++) {nums[i] = rand.nextInt(num);num -= nums[i];}nums[nums.length - 1] = num;return nums;}}

注意:滑块按钮滑到指定区域,可能会出现滑块被吃掉的情况!这是因为被判定为机器操作,所以要尽量模拟出人的速度滑一定的距离停止n毫秒,经过我不断的调试,这样可以减少被误判的几率。成功率在80%左右。

 这是小编在开发学习使用和总结的小Demo,  这中间或许也存在着不足,希望可以得到大家的理解和建议。如有侵权联系小编!

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...