Jsoup爬取优快云博客

本文介绍了一个使用Jsoup库进行网页爬取的示例项目,详细展示了如何抓取优快云博客文章列表,包括文章标题、链接、创建时间和阅读量等信息,并将数据保存为文本文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人Jsoup练习之作,只做参考:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.3</version>
</dependency>
package 优快云;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: BaiDing
 * @Date: 2018/9/24 19:14
 */
public class JsopDemo {

    private static final String BASE_URL = "https://blog.youkuaiyun.com/liujun03/article/list/";
    private static int ARTICLE_SORT=0;

    private int getAllPageCount(){
        int count = 0;
        try {
            Document doc = Jsoup.connect(BASE_URL).get();
            Elements scriptList = doc.select("script");
            for(Element script : scriptList){
                String text = script.data();
                if(text.contains("getAllUrl")){
                    String[] splitArray = text.split(";");
                    int pageSize = 0;
                    int listTotal = 0;
                    for(String split : splitArray){
                        if(split.contains("pageSize")){
                            pageSize = Integer.valueOf(split.split("=")[1].trim());
                        }
                        if(split.contains("listTotal")){
                            listTotal = Integer.valueOf(split.split("=")[1].trim());
                        }
                    }
                    count = listTotal%pageSize == 0 ?listTotal/pageSize:listTotal/pageSize+1;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return count;
    }

    private void testJsop(int page,BufferedWriter bw) {
        String url = BASE_URL + page;
        try {

            Document doc = Jsoup.connect(url).get();
            Elements articleDiv = doc.select("div.article-list");
            Elements articleList = articleDiv.select("div.csdn-tracking-statistics");
            for(Element article : articleList){
                String linkUrl= article.select("a").first().attr("href");
                if(linkUrl.contains("liujun")) {
                    ARTICLE_SORT++;

                    String linkTitle = article.select("a").first().text();
                    Elements num= article.select("p span");
                    String date = num.get(0).text();
                    String readNum = num.get(1).text();
                    String reviewNum = num.get(2).text();
                    StringBuilder data = new StringBuilder()
                        .append(ARTICLE_SORT)
                        .append(" 标题: ")
                        .append(linkTitle)
                        .append(" , 链接: ")
                        .append(linkUrl)
                        .append("\t\n")
                        .append("创建时间: ")
                        .append(date)
                        .append(" , ")
                        .append(readNum)
                        .append(" , ")
                        .append(reviewNum);
                    bw.write(data+"\t\n");
                }
            }

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

    public static void main(String[] args){
        JsopDemo jsopDemo = new JsopDemo();
        try{
            DateFormat bf = new SimpleDateFormat("yyyyMMddHHmmss");
            String fileName =bf.format(new Date())+".txt";
            File file = new File("D:/优快云/"+fileName);
            if(!file.exists()){
                file.createNewFile();
            }
            FileOutputStream fos=new FileOutputStream(file);
            OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8");
            BufferedWriter bw=new BufferedWriter(osw);
            int count = jsopDemo.getAllPageCount();
            for(int i=1;i<=count;i++){
                jsopDemo.testJsop(i,bw);
            }
            bw.close();
            osw.close();
            fos.close();
        }catch (Exception e){
            e.printStackTrace();
        }


    }
}

### 使用 Java 编写网络爬虫抓取 优快云 博客文章内容 要实现使用 Java 抓取 优快云 博客的内容,可以通过 `jsoup` 库完成 HTML 解析和数据提取的任务。以下是详细的解决方案: #### 依赖库引入 首先需要在项目中引入 `jsoup` 库。如果使用 Maven 构建工具,则可以在 `pom.xml` 文件中添加以下依赖项: ```xml <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.15.3</version> </dependency> ``` #### 实现分页功能 为了处理多页面的数据采集,可以分析目标网站的 URL 结构并模拟请求不同页码下的资源。通常情况下,优快云博客列表会带有参数化的分页链接(如 `page=1`, `page=2`)。因此,在程序设计上需循环调用这些不同的 URL。 下面是一个完整的代码示例用于演示如何利用 jsoup抓取指定用户的全部博文摘要及其详情链接,并支持跨多个页面读取数据: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class CsdnBlogSpider { public static void main(String[] args) throws Exception { String baseUrl = "https://blog.csdn.net/username/article/list/"; int totalPages = getTotalPages(baseUrl); // 获取总页数 for (int page = 1; page <= totalPages; page++) { System.out.println("正在抓取第" + page + "页..."); String url = baseUrl + page; Document doc = Jsoup.connect(url).get(); Elements articles = doc.select(".article-item-box"); // 假设这是每篇文章对应的 CSS 类名 for (Element article : articles) { String title = article.selectFirst("h4 a").text(); // 文章标题 String link = article.selectFirst("h4 a").attr("href"); // 文章链接 System.out.printf("标题:%s\n链接:%s%n", title, link); // 如果还需要深入到具体的文章页面去获取更多细节... fetchArticleDetails(link); } } } private static int getTotalPages(String baseUrl) throws Exception { Document doc = Jsoup.connect(baseUrl + "1").get(); Element pagination = doc.selectFirst(".pagination"); if (pagination != null) { return Integer.parseInt(pagination.select("a:last-child").text()); } else { throw new RuntimeException("无法找到分页信息!"); } } private static void fetchArticleDetails(String articleUrl) throws Exception { Document detailDoc = Jsoup.connect(articleUrl).get(); String content = detailDoc.select("#content_views").html(); // 提取正文部分 System.out.println("\t文章内容:" + content.substring(0, Math.min(content.length(), 80)) + "..."); // 打印前部分内容作为预览 } } ``` 上述代码实现了以下几个核心功能: - **连接网页**:通过 `Jsoup.connect()` 方法访问给定的目标网址。 - **解析文档结构**:借助于强大的选择器语法定位所需的信息节点。 - **遍历所有条目**:逐一遍历当前页面上的每一个帖子记录。 - **递归加载子页面**:对于每个独立的文章入口再次发起新的 HTTP 请求以获得更详尽的内容描述[^1]^。 注意替换 `"https://blog.csdn.net/username"` 中的实际用户名以及调整 `.article-item-box` 和其他可能变化的选择符路径匹配实际布局情况。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值