【爬虫】Java 爬虫组件 Jsoup

【爬虫】Java 爬虫组件 Jsoup

写在前面

爬虫是通过编程的方式,从网站上获取数据的一种方式。很多语言都提供的有爬虫功能,都大同小异。这篇文章分享的是 Java 的爬虫组件 jsoup 的使用。以下案例以爬去小说为例

实现思路和步骤

步骤一:引入 Jsoup

  • 普通的 Java 项目需要手动下载 jsoup jar 包,导入到项目中。

  • Maven 项目可以导入 jsoup 坐标

    xml 复制代码
     <dependency>
       <groupId>org.jsoup</groupId>
       <artifactId>jsoup</artifactId>
       <version>1.13.1</version>
     </dependency>

步骤二:获取页面组件内容

java 复制代码
// 借助 jsoup 工具获取网站的信息
// 获取链接对象
Connection connect = Jsoup.connect(site);
// 获取网站的文档对象
Document document = connect.get();

步骤三:分析页面构成获取需要的组件

  • 页面是通过 HTML 标签组成的,可以使用浏览器的开发者工具,找到需要获取的组件。
  • 分析组件的特征,看是否有 id、class 等相关的标识。
  • 根据标识获取组件对象,注意除 id 外,其他标识获取到的都是多个。
  • 有些数据在 HTML 的标签属性中,比如超链接、图片的请求地址在 href、src 属性中,所以还需要搭配attr()方法获取。

    下图则是通过浏览器开发者工具分析的截图:
    1、章节的正文在<ul class="chapterlist"></ul>中。
    2、章节的名称在 ul li 的超链接中。
    3、章节的连接在超链接的 href 属性中。

代码案例

java 复制代码
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;

/**
 * 爬虫案例:爬取数据写入到磁盘。
 * 1、文本
 * 2、图片
 * 爬取小说:
 * 1、小说的网址。
 * 2、分析网站的构成,获取需要的信息。
 * 2.1 HTML的技术
 */
public class JsoupDemo {
    public static void main(String[] args) throws IOException {
        // 网站地址
        String site = "https://www.69shuba.cc/book/64272/";

        // 借助 jsoup 工具获取网站的信息
        // 获取链接对象
        Connection connect = Jsoup.connect(site);
        // 获取网站的文档对象
        Document document = connect.get();

        // 从文档对象中获取需要的组件
        Elements chapterList = document.getElementsByClass("chapterlist");
        Element ul = chapterList.get(1);

        // 获取所有的 a 标签
        Elements as = ul.getElementsByTag("a");

        File file = new File("D://a.txt");
        if(!file.exists()){
            file.createNewFile();
        }

        FileOutputStream fos = new FileOutputStream(file, true);

        // 遍历所有的 a 元素
        for (Element a : as) {
            // 得到章节名称
            String chapterName = a.text() +  "\r\n";

            // 把章节写入到文件
            fos.write(chapterName.getBytes());

            // 获取的是超链接的 href 属性
            String href = a.attr("href");
            href = "https://www.69shuba.cc/book/64272/" + href;

            // 请求章节地址
            Connection chapterConnection = Jsoup.connect(href);
            Document chapterDocument = chapterConnection.get();

            // 获取需要的组件
            Element htmlContent = chapterDocument.getElementById("htmlContent");
            String content = htmlContent.text();

            // 把章节写入到文件
            fos.write(content.getBytes());
            fos.write("\r\n\r\n".getBytes());

            System.out.println("《" + a.text() + "》" + "下载完成!");

            try {
                Random random = new Random();
                Thread.sleep(random.nextInt(5000));
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        fos.close();
        System.out.println("小说下载完成!");
    }
}
相关推荐
嘿嘿-6633 分钟前
Windows 一键使用 GPT-6 Astra:Codex CLI 配置教程
java·人工智能·windows·gpt·chatgpt·web
统计学小王子1 小时前
数学建模国赛倒计时4天——《统计模型精讲(混合效应模型R语言实现)》
开发语言·数学建模·r语言
知无不研1 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
郝学胜-神的一滴1 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
dsyyyyy11011 小时前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
策案案案2 小时前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea
“AI国潮设计-小江”3 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode
K哥爬虫3 小时前
【验证码逆向专栏】某美世界卡状态查询滑块逆向分析
爬虫
shehuiyuelaiyuehao4 小时前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法