2024年全新基于Java爬取微博数据(完整版)

news2024/11/30 0:39:53

2024年全新基于Java爬取微博数据(完整版)

  • 爬虫背景
  • 爬虫分析
  • 爬取微博主页正文列表数据
    • 引入jar包
    • 编写代码
    • 关于微博 Cookie
    • 处理文本的正则
  • 微博正文长文本补全
    • 什么是正文长文本
    • 获取正文长文本
    • 编写代码
  • 导出微博数据到Excel
    • 引入jar包
    • 编写代码
  • 突来的疑问
    • 微博正文内容分析
    • 转存 图片 or 视频
  • 补充微博正文列表图片 or 视频 内容
    • 数据分析
    • 编写代码
    • 执行结果
  • 获取微博主页用户数据
    • 数据分析
    • 微博主页用户数据
    • 编写代码
  • 写在最后
  • 注意点

爬虫背景

最近有这方面的需求,于是就研究了一下通过Java爬取微博数据,由于本人是后端Java开发,因此没有研究其他爬取微博数据的方法,比如通过Python爬取微博数据。大家感兴趣的可以自行查找基于Python爬取微博数据的方法。在爬取微博数据之前,先声明一下,本人爬取的微博数据仅用于测试Java爬取微博数据的可行性,并不会用于其他非正当地方,另外,爬取的数据也都是每个人都可以通过微博客户端正常看到的,不存在爬取隐秘数据的情况。大家在进行爬取数据的操作时也应注意不该爬取非授权数据,防止给自己喜提“非法获取计算机信息系统数据罪”“破坏计算机信息系统罪”等。一切爬虫操作都应在合法合规的情况下进行。

爬虫分析

在进行爬虫操作之前,我们先来看一下微博客户端的页面结构,以及对应的请求链接,数据响应情况等,方便为后续爬取微博数据做准备。比如这里打开一个环球网的微博主页:https://weibo.com/u/1686546714 可以看到
在这里插入图片描述
那么我们打开浏览器开发者工具,按F12键,打开开发者工具,选择【网络】或者【network】,然后再次刷新当前页面可以看到如下请求
在这里插入图片描述
点击对应的URL,查看URL的响应,最终会找到请求链接 /ajax/statuses/mymblog?uid=1686546714&page=1&feature=0 的响应正是我们需要爬取的数据内容来源
在这里插入图片描述
到这里,确定了数据来源URL之后,我们就可以进行后续的爬取数据操作了。

爬取微博主页正文列表数据

引入jar包

整个爬取数据操作我们需要用到两个 jar 包 hutool-all 、 fastjson ,那么我们需要首先在项目 pom.xml 文件中引入这两个 jar 包

<!-- hutool-all -->
<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version> 5.3.4</version>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.80</version>
</dependency>

编写代码

jar 包引入之后开始编写代码,编写完成后完整代码如下 DemoWeiBo.java

package com.ruoyi.web.controller.demo.controller;

import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

public class DemoWeiBo
{
   
     /**
     * 主函数入口,用于从微博抓取数据并存储到Excel中。
     *
     * @param args 命令行参数(未使用)
     * @throws ParseException 当日期解析发生错误时抛出
     */
    public static void main(String[] args) throws ParseException {
   
        // 定义微博数据抓取的URL模板
        String url = "https://weibo.com/ajax/statuses/mymblog?uid=1686546714&feature=0&page=%s";

        // 初始化日期格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 循环抓取3页数据
        for (int i = 1; i <= 1; i++) {
   
            try {
   
                // 输出开始抓取的提示信息
                System.out.println("开始获取第" + i + "页数据");

                // 格式化URL并发送HTTP请求获取响应
                String urlstr = String.format(url, i);
                HttpResponse response = HttpUtil.createGet(urlstr)
                        .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")
                        .header("Cookie","浏览器Cookie")
                        .execute();

                // 解析响应体
                String body = response.body();
                //System.out.println(body);

                JSONObject jsonObject2 = JSONObject.parseObject(body).getJSONObject("data");
                JSONArray list = null;
                if (Objects.nonNull(jsonObject2)) {
   
                    // 处理数据列表
                    list = jsonObject2.getJSONArray("list");

                    // 遍历并处理每条微博数据
                    for (Object o : list) {
   
                        JSONObject data = (JSONObject) o;
                        // 解析并处理微博的其他信息
                        Date created = new Date(data.getString("created_at"));
                        System.out.println("created:"+dateFormat.format(created));
                        String regex = "<[^<>]*>";
                        String text = data.getString("text").replaceAll(regex, "");
                        System.out.println("text:"+text);
                        String repost = data.getString("reposts_count");
                        System.out.println("repost:"+repost);
                        String comment = data.getString("comments_count");
                        System.out.println("comment:"+comment);
                        String like = data.getString("attitudes_count");
                        System.out.println("like:"+like);
                    }
                }

                // 输出完成提示并关闭响应,休眠以避免频繁请求
                System.out.println("第" + i + "页数据获取完毕");
                response.close();
                // 如果列表为空,终止循环
                if (list == null || list.size() == 0) {
   
                    break;
                }
                Thread.sleep(700);
            } catch (Exception e) {
   
                // 打印异常信息
                e.printStackTrace();
            }
        }
    }
}

代码中请求 URL 中的参数 page 代表当前爬取的是第几页数据,因此代码中进行了字符占位,方便后续的分页数据的替换
在这里插入图片描述

关于微博 Cookie

爬取微博数据时,必须要为请求 URL 添加 Header 信息 ,增加请求头 Cookie ,没有请求头 Cookie 的话,无法返回正常的响应数据,而是重定向到访客页面
在这里插入图片描述
那么关于请求头 Cookie 的来源,我们可以到浏览器的【网络】中刚才找到的请求 URL ,点击【标头】 下滑看到如下内容,红框部分就是 Cookie 内容
在这里插入图片描述
由于没有登录账号,因此这里的 Cookie 就属于访客 Cookie,那么微博对于访客 Cookie 的数据访问权限比较有限,在通过访客 Cookie 获取数据时,你只能获取当前请求 URL 的前两页数据,每页 20 条,整体也就是 40条数据,如果有置顶微博的话,置顶微博不算在这两页内,那么你就可能会获取到 大于 40 条的微博数据。当你获取 第 3 页数据时,请求链接只返回成功状态,但是没有 data 数据返回
在这里插入图片描述
而正常情况下 response.body() 应该返回这样的内容
在这里插入图片描述
将 response.body() 数据格式化之后 如图
在这里插入图片描述
获取到微博数据之后,在代码中打印的数据内容具体属性 text : 文本内容 reposts_count : 转发数 comments_count : 评论数 attitudes_count : 点赞数
最终的打印结果可以看到如下请求链接返回内容,
在这里插入图片描述
到这里我们爬取微博数据就完成了,整个代码逻辑比较清晰,后续对于爬取到的微博数据的处理可以根据具体的业务需求。

处理文本的正则

另外,对于代码中的正则表达式 String regex = “<[^<>]*>”; 表示的意义:【用于匹配以"<“开头,紧接着是0个或多个不包括”<“和”>“的字符,最后以”>"结尾的字符串。这个正则表达式常用于从一段文本中提取标签内容,例如从

<html><body><h1>Hello, World!</h1></body></html>

中提取出

Hello, World!

在线正则表达式匹配结果如图
在这里插入图片描述
当然,微博数据并不是只有这些的,你可以直接将我们爬取数据的请求 URL 放在浏览器看到
在这里插入图片描述
那么到这里关于 爬取微博主页正文列表数据 的操作就完成了。

微博正文长文本补全

什么是正文长文本

在爬取微博主页正文列表数据的过程中,大家可能不太会注意到这样的微博数据,比如
在这里插入图片描述
这样的文本数据有什么特点呢?直观的可以看到 在微博正文结束 出现了【展开】字样,那么这样的微博内容通过Java爬取数据获取到的 text 字段的取值内容是这样的

text:#伊朗将宣布总统莱希等遇难人员葬礼安排#据伊朗国家电视台报道,伊朗政府内阁举行了特别会议,将会宣布伊朗总统莱希等遇难人员的葬礼安排。#伊朗总统莱希等高级官员遇难#据伊朗官方通讯社报道,莱希5月19日在伊朗东阿塞拜疆省出席一个大坝的落成仪式后,其所乘坐的直升机在返回大不里士的途中失事, ​​​ ...展开

可以看到 text 字段同样返回的内容是有 【展开】 字样的,那么按常理看,微博正文内容肯定时没有获取完整的。那么这个时候就需要补齐长文本了。

获取正文长文本

在微博页面点击【展开】可以看到,触发了ajax 方法 /ajax/statuses/longtext?id=Of8PMwTSJ 获取微博内容详情并补足内容展示
在这里插入图片描述
参数 id=Of8PMwTSJ 来自于 爬取微博数据请求链接 /ajax/statuses/mymblog?uid=1686546714&page=1&feature=0 返回的数据
在这里插入图片描述

编写代码

下面对于有 【…展开】 字样的微博内容,往往就是需要补足微博长文本内容的,那么可以在代码中增加如下内容

//有一种情况,就是当页面文本内容过多的时候,微博默认不展示全部,而是出现 【...展示】 按钮,此时需要再请求一个 URL 获取展开后的文本内容
if (text.lastIndexOf("...展开") != -1) {
   
    //说明存在 展开 需要重新获取 text 内容
    String mblogid = data.getString("mblogid");
    // 格式化URL并发送HTTP请求获取响应
    String unfoldurlstr = String.format(unfoldurl, mblogid);
    HttpResponse response2 = HttpUtil.createGet(unfoldurlstr)
        .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")
        .header("Cookie",cookie)
        .execute();
    // 如果没有长文本内容会返回 {"ok": 1,"http_code": 200,"data": {}}
    String body2 = response2.body();
    JSONObject jsonObject2 = JSONObject.parseObject(body2).getJSONObject("data");
    String longTextContent = jsonObject2.getString("longTextContent");
    System.out.println("longTextContent:"+longTextContent);
}

其中,cookie和在爬取微博正文内容时用的是同一个cookie,再次执行 main 方法看到如下内容
在这里插入图片描述
到这里关于微博主页正文列表中微博正文内容在爬取数据时缺失的 【…展开】里面的文本内容也就补齐了,那么下面我们就可以导出我们爬取到的微博主页正文列表数据到 Excel 中查看了。

导出微博数据到Excel

引入jar包

补全了微博正文内容后,就可以进行下一步操作了,将爬取的微博数据导出到Excel中去,那么首先需要引入 Excel 相关操作 jar 包 ,pom.xml 文件增加

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>3.0.5</version>
</dependency>

编写代码

然后根据所需字段创建导出微博数据的实体对象类 ExcelData.java

package com.ruoyi.web.controller.demo.controller

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

继电器介绍及qt操作继电器实战

一.继电器基础介绍 32路继电器通常用于自动化控制系统中&#xff0c;能够同时控制多达32个不同的电气设备。以下是对32路继电器的一些详细介绍&#xff1a; 1. 基本概念 继电器&#xff1a;一种电气控制装置&#xff0c;当输入信号&#xff08;通常是电流或电压&#xff09;…

浏览器请求无缝导入apifox(无需客户端,在线使用)方法

不用下载客户端浏览器在线模拟请求&#xff0c;方便快捷&#xff01; 废话不多少&#xff0c;只需三步&#xff0c;往下看&#xff01; 一步&#xff1a; 打开F12 -> 网络 -> 找到你要模拟的请求&#xff0c;右键以cURL格式复制 二步&#xff1a; Apifox 访问Apifox的w…

“浙里办”统一用户组件-接入 基于单点登录票据换取请求 token

基于单点登录票据换取请求 token 1. 请求地址 政务外网地址: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007/ uc/sso/access_token 互联网地址: https://ibcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007 /uc/sso/access_token 2. 入参…

AFSim 仿真系统----集成指南

引言 本文档描述了将新功能扩展和集成到 AFSIM 中的有限方法。允许并描述多种方法&#xff0c;以及在 AFSIM 社区标准和指南中引入集成作为可共享资源的要求。 概述 核心可执行文件 基于 AFSIM 的可执行文件通常由单个 AFSIM “应用程序” 组成。该应用程序维护脚本类型、扩…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载&#xff1a;MySQL :: Download MySQL Community Server 本文也绑定该资源包&#xff0c;免费提供下载学习。 1.系统版本 2.新建目录&#xff0c;存放数据库安装包&#xff0c;并且上传 需要用到的工具&#xff1a;yum -y install vim lrzsz tar 上传解压&…

SAP EWM 包装

目录 1 简介 2 业务流程 3 主数据 4 后台配置 1 简介 SAP S4 HANA 里 EWM 包装功能使用 PS&#xff08;packaging specification&#xff09;代替原有的包装功能 PM&#xff08;packaging management&#xff09;, PI&#xff08;packaging instruction&#xff09;。PS 生…

UNiapp之微信小程序导出Excel

效果如下 参考小程序&#xff1a;日常记一记 ---账单页面 主要功能是根据筛选条件导出账单明细列表&#xff0c;实现该功能主要借助一个工具(excel.js)&#xff0c;可在文章顶部下载或者一下网盘下载 https://pan.baidu.com/s/1RLisuG4_7FGD0Cnwewyabg?pwdpd2a 提取码: pd2a…

C# 判断

|判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;| | |-------------------------------------------------------------|–| | | | 下面是…

HormonyOS踩坑JSON.stringfy

前两天发现一个问题 就是一个值 用as string就可以打印出来 用JSON.stringfy()就不行 百思不得其解 想破了脑袋&#xff01;&#xff01;&#xff01;终于被我发现了 原因就在于上边那个包&#xff01;&#xff01;&#xff01;&#xff01;把那个包删除了就好了&#xff…

勇闯机器学习(第二关-数据集使用)

以下内容&#xff0c;皆为原创&#xff0c;重在无私分享高质量知识&#xff0c;制作实属不易&#xff0c;请点点关注。 好戏开场了~~~(这关涉及到了加载数据集的代码&#xff0c;下一关&#xff0c;教你们安装机器学习库) 一.数据集 这一关的目标 知道数据集被分为训练集和测…

一款搭载远翔FP5207芯片的大功率音箱,蓝牙音箱的组成和拆解展示

一款搭载远翔FP5207芯片的大功率音箱&#xff0c;蓝牙音箱的组成和拆解展示&#xff1a; 它主要以电池、功放、蓝牙、外壳结构组成。音箱放电需内置升压芯片FP5207或5217进行电池升压给功放供电。 为同时满足便携性需求并提供足够的功率&#xff0c;音箱通常配备了12V铅酸电池…

MySQL中的DML操作()

一、添加数据(INSERT) 1.1 选择插入 INSERT INTO 表名(列名 1 &#xff0c;列名 2 &#xff0c;列名 3.....) VALUES(值 1 &#xff0c;值 2 &#xff0c;值 3......); 1.2 默认值处理(DEFAULT) 在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入数据时并未指定该…

【C++】OJ习题(初阶)

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、字符串&#x1f4a5;1.1 字符串相加&#x1f4a5;1.2 验证回文字符串&#x1f4a5;1.3 反转…

单例模式 详解

单例模式 简介: 让类只初始化一次, 然后不同的地方都能获取到同一个实例 这是非常常用的一种模式, 系统稍微大一点基本上都会用到. 在系统中, 不同模块的总管理类都已单例模式居多 这里我们不仅使用c实现单例模式, 也会用python2实现一遍 python代码 想要看更详细的python单…

【Python机器学习】NLP——一个简陋的聊天机器人

目录 正则表达式 一个简答的聊天机器人 另一种方法 正则表达式就是一种FSM&#xff0c;同时它也给出了一种可能的NLP方法&#xff0c;即基于模式的方法。 正则表达式 现实生活中&#xff0c;密码锁其实就是一台简单的语言处理机。密码锁不能阅读和理解课本&#xff0c;但是…

高性能web服务器nginx

目录 nginx简介 服务端 I/O 流程 Nginx 进程结构 Nginx启动流程 nginx的源码编译下载 nginx命令常见参数 nginx的配置文件详解 全局配置优化 nginx的平滑升级和回滚 nginx目录匹配优先级测试&#xff08;因为只支持访问文件&#xff0c;所有不比对匹配目录优先级&…

STM32GPIO引脚八种工作模式

1. GPIO简述 GPIO&#xff08;General-purpose input/output&#xff09;&#xff0c;通用型输入输出。简单理解就是我们可以控制输入输出的STM32引脚&#xff0c;统称为GPIO。 GPIO存在的意义就是用程序控制或读取它们的输出或输入。 2. 功能描述 每个GPI/O端口有两个32位配…

代码随想录算法训练营day50:图论01:图论理论基础;深度优先搜索理论基础;98. 所有可达路径;广度优先搜索理论基础

图论理论基础 分类&#xff1a;有向图&#xff0c;无向图&#xff0c;有无权重 度&#xff1a;【无向图】&#xff1a;有几条边连接该节点&#xff0c;该节点就有几度。 【有向图】&#xff1a;每个节点有出度和入度。出度&#xff1a;从该节点出发的边的个数。入度&#xf…

.net maui安卓开发中适用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…

前端性能优化的指标

性能优化指标的出现,谷歌在2020年提出的Core Web Vitals 和 Web Vitals 了解谷歌浏览器自带的性能调试工具DCL、L、FP、FCP、LCP,图层(有layout布局就是回流,painting绘制就是重绘) 回流和重绘的理解 页面第一次打开一定回流和重绘,回流一定重绘,回流出现一般是位置改变…