带你用 Java 入门爬虫

457 阅读4分钟

前言

说到爬虫,不管大家会不会,肯定或多或少都听过,就是用来抓取网站上的信息的一种技术。大家听得最多的肯定都是说用 Python 来爬虫,其实咱大 Java 也阔以的😎废话不多说,看看我们今天的“素材”。

我们在 Bilibili 上搜索 Java 自然会返回给我们的结果,我们今天就是要把它返回给我们的结果数据通过 Java 程序给获取到。

依赖

解析网页的爬虫包:jsoup

我们在这里只是网页,如果要获取文件、音乐和电影等数据需要用到 Apachetika 包,感兴趣的也可以去研究下这个🛠。

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.11.3</version>
</dependency>

整活儿

获得整个页面

我们先拿到搜索页面的 URL 地址,这就是咱的“素材”😁

public static void main(String[] args) {
    // 不能获取到 AJAX 请求的数据
    String url = "https://search.bilibili.com/all?keyword=java&from_source=nav_suggest_new";
    try {
        // 开始解析网页:第一个参数是需要被解析的 URL,第二个参数是解析的超时时间,超时则报错
        Document document = Jsoup.parse(new URL(url), 10000);
        // 这里返回的 document 就是 JS 里的 Document 对象,把它打印出来其实还是挺亲切的。
        System.out.println(document);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在刚刚的搜索页面通过 F12 看到里面的内容其实和我们打印出来的是一样的。

获得目标数据

  1. 定位目标数据的位置

    我们要获得 ul 标签里的每个 class 值为 "video-item matrix" 的 li 标签。

  2. 确定目标数据所在标签

    我们这里就获得每个视频的标题观看数上传时间up主的数据信息。

    • 标题:获得当前这个 li 标签里面 class 值为 "title" 的 a 标签的 title 值。

    • 观看:获得当前这个 li 标签里面 class 值为 "so-icon watch-num" 的 span 标签。

      • 拿到当前该 span 标签的 title
      • 拿到当前该 span 标签的文本内容
    • 上传时间:获得当前这个 li 标签里面 class 值为 "so-icon watch-num" 的 span 标签。

      • 拿到当前该 span 标签的 title
      • 拿到当前该 span 标签的文本内容
    • UP主:这里的标签 class 属性只有一个 "so-icon",它的前三个标签也有这个属性

      所以我们这里就是获得当前这个 li 标签里面 class 值为 "so-icon" 的第四个 span 标签。

      • 拿到当前该 span 标签的 title
      • 拿到当前该 span 标签的文本内容
  3. 上代码

    有没有觉得这些方法其实都非常熟悉?(不会 JS 当我没说😁)

    获得标签的方式有很多种,不一定要和我完全一样

    • 获得我们要的每一个 li 标签

      Elements elements = document.getElementsByClass("video-item matrix");
      
    • 遍历每一个 li 标签,拿到我们要的标签数据

      for (Element element : elements) {
          // 标题标签:class 值为 "title" 的第一个 a 标签
          Element titleEle = element.getElementsByClass("title").get(0);
          // 观看标签:class 值为 "so-icon watch-num" 的第1个 span 标签
          Element watchNumEle = element.getElementsByClass("so-icon watch-num").get(0);
          // 上传时间标签:class 值为 "so-icon time" 的第1个 span 标签
          Element timeEle = element.getElementsByClass("so-icon time").get(0);
          // UP主标签:class 值为 "so-icon" 的第4个 span 标签
          Element upEle = element.getElementsByClass("so-icon").get(3);
          
          System.out.println("标题:" + titleEle.attr("title"));
          // 观看标签的 title 值 → 观看标签的文本内容
          System.out.println(watchNumEle.attr("title") + "→" + watchNumEle.text());
          // 上传时间标签的 title 值 → 上传时间标签的文本内容
          System.out.println(timeEle.attr("title") + " → " + timeEle.text());
          // UP主标签的 title 值 → UP主标签的第2个子节点的文本内容
          System.out.println(upEle.attr("title") + " → " + upEle.child(1).text());
      }
      

运行!齐活儿~

jsoup 是个很强大的工具,但它对中文的支持还是挺捉急的。就是如果把 URL 中的 java 直接换成一个中文词,比如编程,这时候其实是没用的。

有两种办法:

  1. 直接在浏览器地址栏中含有中文的 URL 复制粘贴过来,它会自动把中文编码

    https://search.bilibili.com/all?keyword=%E7%BC%96%E7%A8%8B&from_source=nav_suggest_new

  2. 手动把你的中文词进行 URL 编码

    URLEncoder.encode("编程");
    

    然后再拼接在你的 URL

最后

这里只是带大家用 Java 入了个爬虫的门,爬虫的路其实还很长,大家感兴趣的可以走一遭😏

如果本文对你有帮助的话不妨点个👍呦。

分享技术,稳住,我们能赢💪!