java爬虫 -jsoup的简用法

发布于:2025-06-29 ⋅ 阅读:(18) ⋅ 点赞:(0)

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 等使用。