http://webmagic.io/   -----webMagic下载地址.

推荐使用谷歌浏览器),下载时先看自己的谷歌浏览器的版本对应的驱动版本然后再下载(版本不匹配的话,启动直接报错).需要配置浏览器驱动的环境变量在path后追加上chromedriver.exe所在的目录.

<dependency>
      <groupId>us.codecraft</groupId>
      <artifactId>webmagic-core</artifactId>
      <version>0.7.3</version>
    </dependency>
    <dependency>
      <groupId>us.codecraft</groupId>
      <artifactId>webmagic-extension</artifactId>
      <version>0.7.3</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.6</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.6</version>
    </dependency>
    <dependency>
      <groupId>us.codecraft</groupId>
      <artifactId>webmagic-selenium</artifactId>
      <version>0.7.3</version>
    </dependency>
    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>3.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-chrome-driver</artifactId>
      <version>3.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-server</artifactId>
      <version>2.18.0</version>
    </dependency>

因为是在摸索所以引了很多的依赖,有些可能不用引,我也懒得再去删了,反正不会报错.

public class Test implements PageProcessor {

  //设置一个全局的参数存放登陆cookies
  private Set<Cookie> cookies;

  private Site site = Site.me().setRetryTimes(3).setSleepTime(100);

  public Site getSite() {
    for (Cookie cookie : cookies) {
      site.addCookie(cookie.getName().toString(), cookie.getValue().toString());
    }
    return site;
  }

  public static void main(String[] args) throws Exception {
    Test test = new Test();
    test.Login();
    Spider.create(test)
          .addUrl("要爬取的页面")
          .run();
       // .runAsync();
  }

  public void process(Page page) {

    String string = page.getHtml().xpath("body").toString();
    String[] split = string.split("<body>");

    // ResultItems items = page.getResultItems();
    // System.out.println(items.get("name"));
  
    // 部分三:从页面发现后续的url地址来抓取
    // page.addTargetRequests(page.getHtml().links().all());

  }

  // 登陆方法
  public void Login() throws IOException {
    System.setProperty("webdriver.chrome.driver",
        "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");

    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("需要自动登陆的页面");
    // 定义验证码变量
    String verify = null;
    try {
      Thread.sleep(3000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    driver.findElement(By.xpath("//div[@class='layui-input-block']/input")).sendKeys("账号");
    driver.findElement(By.id("userPwd")).sendKeys("密码");
    //获取点击按钮
    WebElement element = driver.findElement(By.xpath("//button[@class='layui-btn layui-btn-fluid']"));
    //验证码获取破解....之后奉上
    
    //模拟点击
    element.click();
    //很重要的一步获取登陆后的cookies
    cookies = driver.manage().getCookies();
    driver.close();
  }

爬虫爬取页面的时候只会爬取静态页面,也就是说只要是js渲染的数据都拿不到的,我们要拿到这些数据只能再次加载这些jsAPI来获取数据(可能还有其他方法,在这里我使用的是该方法).

Selenium Java size设定 selenium java 登录页面_chrome

 当我们访问要访问的页面的时候,打开查看器network会发现许多的请求,我们可以从这些请求中获取到数据,因为静态页面中加载不到这些数据,我们就重新加载js. 例如,图中这个方法response返回的值时json格式的数据,如果它被js渲染之后赋值给页面,我们是拿不到的,这时,右键点击该请求copy -- copy link address 将这个链接在新页面打开就会发现数据是我们要的.我们就把该链接添加到webMagic中加载.就可以得到这些数据了.

如果静态页面能直接拿到数据的话,那就更简单了,使用webMagic自带的抓取元素方法直接抓取就行了.(推荐使用xpath方式)基本能完成所有你想要的标签. (祝大家都能爬到自己想要的数据!)