selenium和browsermob简易爬虫

  • 简单介绍selenium和browsermob
  • 环境搭建
  • demo编写
  • 总结


简单介绍selenium和browsermob

首先介绍一下selenium和browsermob这两个东西。selenium这个东西是模拟浏览器操作的,最重要的是可以模拟鼠标点击和键盘输入的操作,甚至还可以操作浏览器的窗口和设置,还可以定义运行js。
browsermob这个东西是用来抓取http请求和响应的,主要是应为selenium只能获取到页面的pageSource(就是页面内的东西)。

环境搭建

首先我这儿使用的是jdk1.8,还有就是使用的maven支持做的项目架构。
不多说,看依赖

<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.8.1</version>
        </dependency>

        <dependency>
            <groupId>net.lightbody.bmp</groupId>
            <artifactId>browsermob-core</artifactId>
            <version>2.1.5</version>
        </dependency>

我这儿没有使用最新版本的selenium,你们可以去试试最新的,但是我这版本是没有问题的。
注意:你还得去下载selenium操作浏览器的驱动
我这个列出两个:火狐浏览器驱动下载谷歌浏览器驱动下载注意:这个驱动版本跟你安装的浏览器版本是对应的,下载过后解压到你指定的文件夹就行,待会呀要使用到这个东西,只需要一个文件路径。

demo编写

废话不多说,直接上代码

System.setProperty("webdriver.gecko.driver", "D:\\drvier\\geckodriver.exe");//这个就是你驱动的文件地址了
        BrowserMobProxy browserMobProxy = new BrowserMobProxyServer();
        browserMobProxy.start();

        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(browserMobProxy);

        FirefoxOptions firefoxOptions = new FirefoxOptions();

        firefoxOptions.setProxy(seleniumProxy);
        firefoxOptions.setHeadless(true);
        firefoxOptions.setAcceptInsecureCerts(true);


        FirefoxDriver firefoxDriver = new FirefoxDriver(firefoxOptions);//我是用的是火狐的浏览器

        browserMobProxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
        browserMobProxy.setHarCaptureTypes(CaptureType.RESPONSE_CONTENT);

        browserMobProxy.newHar("自己指定一个名字,随便写");

        firefoxDriver.manage().window().maximize();
        //firefoxDriver.manage().deleteAllCookies();
        // 与浏览器同步非常重要,必须等待浏览器加载完毕
        firefoxDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);


        firefoxDriver.get("你要去爬取得url");
        WebDriver.Options manage = firefoxDriver.manage();
        manage.addCookie(bduss);
        Thread.sleep(3000);
        firefoxDriver.navigate().refresh();
        String pageSource = firefoxDriver.getPageSource();//获取页面数据
        System.out.println("pageSource-->" + pageSource);
        String title = firefoxDriver.getTitle();//获取标题
        System.out.println("title-->" + title);
        Set<Cookie> cookies = manage.getCookies();//获取cookie
        for (Cookie cookie : cookies) {
            System.out.println("cookie-->" + cookie.getName() + "::" + cookie.getValue());
        }

        Thread.sleep(4000);

        WebElement elementByClassName = firefoxDriver.findElementByClassName("你想要获取的class标签"); 
        elementByClassName.click(); //模拟鼠标点击事件
        System.out.println("--------------------------");

        Har har = browserMobProxy.getHar();
        for (HarEntry entry : har.getLog().getEntries()) {//这儿就是获取所有的请求响应的数据
            HarResponse response = entry.getResponse();
            HarRequest request = entry.getRequest();
            if(request.getUrl().contains("/download"))
            System.out.println("我出来了");
            HarContent content = response.getContent();
            String text = content.getText();//这个是拿到响应的body,就是你想要的json数据了
            System.out.println("text-->-->"+text);
        }

        System.out.println("--------------------------");
        String pageSource1 = firefoxDriver.getPageSource();
        System.out.println(pageSource1);


        Thread.sleep(200);


        String pageSource2 = firefoxDriver.getPageSource();
        System.out.println(pageSource2);

        Thread.sleep(5000);

总结

selenium这个东西本身是用来做自动化测试和检测的,但是用来爬取东西也很方便,可以绕过很多网站反爬虫的机制,反正就是很简单,selenium的api还有很多,功能也很强大,可以去了解一下。