java+webMagic+selenium 实现自动登陆爬取登陆后的信息

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

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


      us.codecraft
      webmagic-core
      0.7.3
    
    
      us.codecraft
      webmagic-extension
      0.7.3
    
    
      org.slf4j
      slf4j-api
      1.7.6
    
    
      org.slf4j
      slf4j-log4j12
      1.7.6
    
    
      us.codecraft
      webmagic-selenium
      0.7.3
    
    
      org.seleniumhq.selenium
      selenium-java
      3.3.1
    
    
      org.seleniumhq.selenium
      selenium-chrome-driver
      3.3.1
    
    
      org.seleniumhq.selenium
      selenium-server
      2.18.0
    

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

public class Test implements PageProcessor {

  //设置一个全局的参数存放登陆cookies
  private Set 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("");

    // 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来获取数据(可能还有其他方法,在这里我使用的是该方法).

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

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

你可能感兴趣的:(java+webMagic+selenium 实现自动登陆爬取登陆后的信息)