selenium使用chrome的headless模式 计算机 内容发表于2017-07-06

无界浏览器爬虫之selenium使用chrome的headless模式

chrome浏览器更新到59版本之后终于在正式版里加入了headless模式 ,也就是可以操纵chrome进入无界面模式,以前写爬虫的时候使用无界浏览器普遍是用phantomjs,chrome浏览器加入headless模式毫无疑问会干掉phantomjs,今晚下班回到家写个代码正好尝试下效果。

这是我用springboot写的一个简单的chrome之headless无界浏览器爬虫抓取天眼查
首先gradle走起来,

group 'net.yuxianghe'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'spring-boot'

//生成的jar包包名和版本
jar {
    baseName = 'test'
    version = '0.1.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

buildscript {
    repositories {
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.4.RELEASE")
    }
}

repositories {
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    mavenCentral()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.5.4.RELEASE")
    compile group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver', version: '3.4.0'
    testCompile 'junit:junit:4.12'
    testCompile('org.springframework.boot:spring-boot-starter-test:1.5.4.RELEASE')
}

chromedriver自己准备好,我用的是2.30版本,目前来说的最新版。
java代码的测试用例如下:

package net.yuxianghe;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * chrome test
 * Created by hxy on 2017/7/6.
 */
public class ChromeDriverTest {

    @Test
    public void test1() throws Exception {
        File file = new File("/Users/hxy/soft/selenium/chrome_driver/2.30/chromedriver");
        ChromeDriverService service = new ChromeDriverService.Builder().usingDriverExecutable(file)
                .usingAnyFreePort()
                .build();
        service.start();

        List<String> args = new ArrayList<>();
        args.add("headless");
        args.add("disable-gpu");
        ChromeOptions options = new ChromeOptions();
        options.addArguments(args);
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        capabilities.setCapability(ChromeOptions.CAPABILITY, options);
        WebDriver driver = new RemoteWebDriver(service.getUrl(),
                capabilities);


        driver.get("http://www.tianyancha.com/company/22822");

        Thread.sleep(20000);


        WebElement webElement = driver.findElement(By.className("base2017"));
        List<WebElement> webElementList = webElement.findElement(By.tagName("table")).findElement(By.tagName("tbody")).findElements(By.tagName("td"));
        if (CollectionUtils.isEmpty(webElementList)) {
            System.out.println("webElementList is empty");
        }
        for (WebElement tdWebElement : webElementList) {
            String s = tdWebElement.getText();
            s = StringUtils.trimAllWhitespace(s);
            if (!StringUtils.isEmpty(s)) {
                System.out.println(s);
            }
        }


        driver.quit();
        service.stop();
    }
}

使用chrome的无界模式顺手抓走了企业的基本信息,深藏功与名。不得不说和phantomjs比起来,chrome的headless模式要好用很多,所以赌一块钱phantomjs这个项目的使用人群很快会被拉走。

另外要多说一句,谷歌的官方说了:

Caution: Headless mode is available on Mac and Linux in Chrome 59. Windows support is coming in Chrome 60. To check what version of Chrome you have, open chrome://version.

windows要等到60的版本才会支持headless模式,哈。