Selenium BOSS 直聘滑动验证

Pangluo · 2018年12月25日 · 最后由 逗你玩儿 回复于 2018年12月26日 · 3100 次阅读

此贴由 markdown 语法编辑,如果有违规请立即删除

前沿

之所以尝试 BOSSzhipin,我想通过脚本去每天点一下简历刷新
51job,智联,猎聘 目前都是没有验证码的。都已经写好了脚本。

思路:既然只要滑动不需要考虑滑动的距离那就简单了多, 在网上找滑动元素的例程

方法自己做了一下修改,可以成功滑动,但是哎呀,出错了,点击刷新再来一次(error:XdrDr)

public static void move(WebDriver driver, WebElement element, int distance) throws InterruptedException {
        System.out.println(element.getAttribute("class"));
        Actions actions = new Actions(driver);
        actions.clickAndHold(element);
        int s = 1;
        int y = 3;
        for (int i = 0; i < 278; i++){
                s += 1;
                y=new Random().nextInt(40) ;


               actions.moveToElement(element, s, y).perform();
               Thread.sleep(new Random().nextInt(100) + 150);
        }


        actions.moveByOffset(300, 5).perform();

        Thread.sleep(1000);

    }

解决方案

就思考了一下,是不是支持鼠标 “前台” 滑动就能通过呢,
使用鼠标滑动几次都成功了,使用程序控制鼠标滑动,是这种鼠标前台的模拟而不是通过鼠标消息去模拟,能不能通过呢?

java 里我不知道怎么使鼠标 “前台操作”
鼠标操作分两种,一种是鼠标消息(后台),一种是前台模拟
发消息(后台),鼠标可以打断操作
前台,模拟鼠标操作,不能打断,显然这不是一种高效的方式
但是这个验证过程我只需要 1 -2 s 那又有什么关系呢?

于是用易语言写了一个 demo
这是一个成功 demo(之所以这里成功了,是因为这里的浏览器是我手动打开的,不是通过 java 的 driver 打开的)
视频演示如下(高版本的浏览器可以直接跳转播放,IE 浏览器则会下载)要是论坛支持视频引用就好了。
http://qiniu.domoyun.com/file-hash-mp4-45ebef86adcb54cd6ab560f62e5d185c865543.mp4
既然可以成功

把这个第三方脚本放入 java re'sou'rces 中,在输入完账号密码后调用这个第三方脚本

private static void firefoxtest() throws InterruptedException, IOException {
    //System.setProperty(ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY, "src/main/resources/driver/ChromeDriver 2.45.exe");
    System.setProperty(SystemProperty.BROWSER_BINARY, "D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");

    FirefoxDriver driver = new FirefoxDriver();
    driver.get("https://login.zhipin.com/?ka=header-login");
    Thread.sleep(2000);
    driver.findElement(By.xpath("//*[@id=\"wrap\"]/div[2]/div[1]/form/div[1]/span[2]/input")).sendKeys("15616216603");;

    driver.findElement(By.xpath("//*[@id=\"wrap\"]/div[2]/div[1]/form/div[2]/span/input")).sendKeys("qq123456");;

    Runtime.getRuntime().exec("src/main/resources/driver/pangluo.exe"); //执行外部程序pangluo.exe
    Thread.sleep(5000);

    driver.findElement(By.xpath("//*[@id=\"wrap\"]/div[2]/div[1]/form/div[4]/button")).click();

    Thread.sleep(6000);

    driver.quit();
}

http://qiniu.domoyun.com/file-hash-mp4-c0241da660bbb3722cb1d5eb8cd06eb31378322.mp4
经反复测试,只要用 driver 打开的浏览器,就无法验证通过,即使是手动用鼠标滑。也是报错/
我测试了 firefox、chrome 都没成功

不通过 selenium,就用易语言全部通过前台点击能达到我的目的,显然是一件低效的事情,况且 BOSSzhipin 刷新简历一天只能刷新一次并且还是收费,

共收到 4 条回复 时间 点赞

我爬某网站数据时就遇到了滑动验证,即使是手动滑动验证也不管用,但是使用 chrome 浏览器的无界面启动,就不需要验证。
另外,之前我查资料是说有这种验证时因为前端 js 的某个文件有判断 webdriver 的,想办法给它改掉也可以。

逗你玩儿 回复

什么叫 chrome 浏览器的无界面启动, 是界面不显示整个操作过程 爬?还是
我也觉得应该是前端 JS 有检测判断,就像你说的有判断 webdriver 的
可惜,我不会调 JS,

这个是不通过 webdriver 驱动的,我手工打开的浏览器
http://qiniu.domoyun.com/file-hash-mp4-45ebef86adcb54cd6ab560f62e5d185c865543.mp4

这个浏览器是 webdriver 驱动的,webdriver 驱动的情况下,即使手动滑动也通不过
http://qiniu.domoyun.com/file-hash-mp4-c0241da660bbb3722cb1d5eb8cd06eb31378322.mp4

楼主可以考虑用 cookie 请求,app 的 cookie 是用不过期的

Pangluo 回复

好像是 chrome 59 或者 60 版本以后的版本都可以无界面启动

option = webdriver.ChromeOptions()
option.add_argument('--headless')
python 是这么设置,java 我感觉应该差不多

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册