为了账号安全,请及时绑定邮箱和手机立即绑定

用Java爬慕课网猿问

标签:
爬虫

使用技术

Java
selenium
Chrome

技术解析

使用Java作为开发语言,selenium作为主要爬虫框架

开发准备

IDEA

Chrome

JDK 8

Maven3.3+

新建Maven项目

新建简单的Maven项目

下载驱动

自行下载 chromedriver.exe

放入项目跟目录

引入jar包

  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.12</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.9.1</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>3.10.0</version>
    </dependency>
  </dependencies>

开始编写

创建BrowserUtils.java文件,用于创建浏览器

/**
 * 打开谷歌浏览器.
 *
 * @return 返回浏览器
 */
public static WebDriver getInstanceByChrome() {
  try {
    String driverDirectory = "chromedriver.exe";
    ChromeDriverService src = new ChromeDriverService.Builder()
            .usingDriverExecutable(new File(driverDirectory)).usingAnyFreePort().build();
    src.start();
    ChromeOptions options = new ChromeOptions();
    ChromeDriver driver = new ChromeDriver(src, options);
    driver.manage().window().maximize();
    return driver;
  } catch (IOException e) {
    e.printStackTrace();
    return null;
  }
}

创建BasicHandler.java,用户存储当前任务的url

public abstract  class BasicHandler {

  private String url;

  public BasicHandler(String url) {
    this.url = url;
  }

  public String getUrl() {
    return url;
  }
}

创建MainHandler用于执行任务

public class MainHandler extends BasicHandler {

  public MainHandler(String url) {
    super(url);
  }


  public List<Task> getTask() throws Exception {
  //todo 爬取代码
  }
}

创建Task类,用于存储下一步需要爬去的任务

public class Task {

  private String url;
  private String title;

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }
}

编写爬虫代码

观察以上图片

可以看到css:item clearfix修饰着所有问题,形成一个列表,需要抓取该css修饰的元素,即可获得整个列表

然后在该元素下,抓取css :que-title,标签的href,text即可抓取到一个问题的标题和链接

实现

在MainHandler,getTask()中加入代码

 WebDriver webDriver = BrowserUtils.getInstanceByChrome();
    if (null == webDriver) {
      throw new Exception("浏览器打开失败");
    }
    webDriver.get(super.getUrl());
    List<WebElement> listElement = webDriver.findElements(By.cssSelector(".item.clearfix"));
    List<Task> tasks = new ArrayList<Task>(listElement.size());
    for (WebElement webElement : listElement) {
      WebElement titleElement = webElement.findElement(By.className("que-title"));
      String title = titleElement.getText();
      String url = titleElement.getAttribute("href");
      Task task = new Task();
      task.setTitle(title);
      task.setUrl(url);
      tasks.add(task);
    }
    return tasks;

打开浏览器

打开一个链接

查找该链接下css为’ques-list’的元素列表

遍历列表,获取元素下的title,href

编写Application.main方法

public static void main(String args[]) throws Exception {
  List<Task> data = new MainHandler("https://www.imooc.com/wenda").getTask();
  data.forEach(d -> {
    System.out.println("title:" + d.getTitle() + "  url:" + d.getUrl());
  });
}

运行main方法,即可看到爬去的title,和url

点击查看更多内容
9人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消