java爬虫 -jsoup的简用法

Jsoup 是一个用于处理实际 HTML 的 Java 库,它提供了非常方便的 API 来提取和操作数据,常用于网页抓取(爬虫)和 HTML 解析。

基本用法

1. 添加依赖

首先需要在项目中添加 Jsoup 依赖:

复制代码
  <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.16.1</version> <!-- 2023年最新稳定版 -->
            </dependency>

2. 实用示例

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


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * #todo
 *
 * @author lyl
 * @version v1.0
 * @since 2025/6/18
 */
public class HttpTest {
    public static void main(String[] args) {

        //第0层挖热点
            run("财经热点",0);
    }


    public static void run(String keyword,int num){
        //String message="https://www.so.com/s?ie=utf-8&fr=360sou_newhome&ls=sm3014395&lm_extend=ctype%3A31&src=home_lm&ssid=083e41eefd6244e8bb13ded1eb7dd060&sp=a93&cp=06c0009a93&nlpv=global_place_b_shbt&q="+keyword;
          String message="https://www.baidu.com/s?wd="+keyword+"&rsv_spt=1&rsv_iqid=0xf0222b4603305c3c&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=ih_0&rsv_enter=1&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsv_btype=i&rsp=0&rsv_sug9=es_2_1&rsv_sug4=2199&rsv_sug=9";
        //String message="https://news.baidu.com/";
        try {
            Document doc = Jsoup.connect(message)
                    .timeout(5000)  // 超时设置(毫秒)
                    .get();
         List<String> result=new ArrayList<>();
            // 2. 使用CSS选择器提取标题
            String title = doc.select("title").text();
            System.out.println("页面标题: " + title);

            // 3. 提取所有段落文本
            Elements paragraphs = doc.select("div");
            for (Element p : paragraphs) {
                //System.out.println("段落: " + p.text()  + "...");
                //获取当前节点的链接
                p.forEach(node -> {
                  //  System.out.println("段落: " + node.text()  + "...");
                   // System.out.println("链接 url: " + node.attr("abs:href"));
                    if(node.text().matches("[0-9]+[\\u4e00-\\u9fa5]+")&&num==0){
                      // System.out.println("段落: " + node.text()  + "...");
                       String[] allMessage=node.text().split(" ");
                       for (int i = 0; i < allMessage.length; i++) {
                           //根据正则表达式[数字中文】过滤
                           if(allMessage[i].matches("[0-9]+[\\u4e00-\\u9fa5]+")){
                              // System.out.println("第"+(i+1)+"条热搜:"+allMessage[i]);
                               if(result.contains(allMessage[i])||match(allMessage[i])){
                                   continue;
                               }
                               result.add(allMessage[i]);
                           }
                          // System.out.println("第"+(i+1)+"条热搜:"+allMessage[i]);
                       }
                    }
                    else{
                        System.out.println("最新消息1: " + node.text());
                    }
                });
            }

            for (String link : result){
                //System.out.println("最新消息: " + link.replaceAll("^[0-9]+",""));
                System.out.println("最新消息: " + link);
                if(num==0) {
                 //   run(link, 1);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 过滤掉无用的信息和序列号
     * @param message
     * @return
     */
    private static boolean match(String message){
        if(message.matches("[0-9]+次阅读+")){
            return true;
        }
        if( message.matches("[0-9]+人聊过+")){
            return true;
        }
        if( message.matches("[0-9]+页")){
            return true;
        }
        if (message.matches("[0-9]+下一页+")){
            return true;
        }
        return false;
    }
}

常用选择器

1. 通过标签选择元素

复制代码
Elements links = doc.select("a"); // 获取所有<a>标签

2. 通过类选择元素

复制代码
Elements newsHeadlines = doc.select(".news-headline"); // 获取class为news-headline的元素

3. 通过ID选择元素

复制代码
Element logo = doc.select("#logo").first(); // 获取id为logo的元素

4. 组合选择器

复制代码
Elements resultLinks = doc.select("div.results > a"); // 获取class为results的div下的直接a子元素

提取数据

1. 获取属性值

复制代码
String linkHref = link.attr("href"); // 获取href属性
String linkText = link.text();       // 获取链接文本

2. 获取HTML内容

复制代码
String html = div.html(); // 获取div内的HTML
String text = div.text(); // 获取div内的文本(不含HTML标签)

3. 遍历元素

复制代码
for (Element link : links) {
    String href = link.attr("href");
    String text = link.text();
    System.out.println(text + " -> " + href);
}

注意事项

  1. 设置超时:建议设置连接超时时间

    复制代码
    Document doc = Jsoup.connect(url)
        .timeout(10000) // 10秒超时
        .get();
  2. 模拟浏览器:有些网站会检查User-Agent

    复制代码
    Document doc = Jsoup.connect(url)
        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
        .get();
  3. 处理相对路径 :使用abs:前缀获取绝对URL

    复制代码
    String absUrl = link.attr("abs:href");
  4. 遵守robots.txt:确保你的爬虫遵守目标网站的爬取规则

  5. 控制请求频率:避免给目标网站造成过大压力

Jsoup 是一个强大而简单的 HTML 解析库,适合大多数简单的爬虫需求。对于更复杂的爬虫任务,可能需要结合其他库如 HttpClient 等使用。

相关推荐
JJay.11 分钟前
Android Kotlin 协程使用指南
android·开发语言·kotlin
csbysj202017 分钟前
jQuery 捕获详解
开发语言
木子欢儿19 分钟前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
专注API从业者23 分钟前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
C++ 老炮儿的技术栈26 分钟前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
Devin~Y29 分钟前
高并发电商与AI智能客服场景下的Java面试实战:从Spring Boot到RAG与向量数据库落地
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag
蜡台34 分钟前
IDEA 一些 使用配置和插件
java·ide·intellij-idea
三道渊1 小时前
进程通信与网络协议
开发语言·数据库·php
磊 子1 小时前
redis详解2
java·spring boot·redis
白露与泡影1 小时前
Java面试题库及答案解析(2026版)
java·开发语言·面试