基于Java爬取微博数据(四) 获取 图片 or 视频

简介: 【5月更文挑战第14天】基于Java爬取微博数据(四) 图片 or 视频 下载

前面已经讲述了基于 Java 爬取微博正文列表内容,微博用户主页内容以及导出爬取到的微博数据等操作,那么下面讲述一下如何处理微博正文中的图片/视频等内容。

图片 or 视频

对于微博正文来说,图片和视频不能同时存在,也就是说你的微博只能选择发9张以内的图片或者发1个视频,那么在爬取微博正文数据时,想要获取微博中的图片/视频该怎么操作呢?我们首先来看一下微博正文中图片或者视频的一些特点,选择任意一篇微博正文,利用浏览器工具选取任意一张图片

image.png

这里可以看到图片的链接。这里需要说明的是微博正文中的图片链接是做过防盗处理的,你直接复制图片链接到浏览器是无法打开的,但是你可以通过 Java 代码来转存 图片。

image.png

同样的方法,利用浏览器工具的抓取功能获取微博正文视频内容地址,视频内容是可以直接放在浏览器打开的,但是需要注意的是视频内容的链接地址有个有效期参数 Expires ,如果超过有效期再打开会提示 403 错误码

image.png

这里获取的视频链接地址通常是这样的

//locallimit.us.sinaimg.cn/o0/RSkMM0NElx08f30vCBPO01041200MgYx0E010.mp4?label=mp4_720p&template=1280x720.25.0&media_id=5036768815153197&tp=8x8A3El:YTkl0eM8&us=0&ori=1&bf=4&ot=h&lp=0000tfMx8&ps=mZ6WB&uid=66f6G2&ab=,8013-g0,3601-g27&Expires=1716360984&ssig=8XIVHnvPwu&KID=unistore,video

没有请求头 http 或者 https ,那么你可以直接将该链接放在浏览器,浏览器会自动适应请求头,视频内容是可以直接播放的。另外微博的默认请求头就是安全请求头 https

image.png

到这里关于微博正文中的图片 or 视频的大概情况介绍完了,下面可以转存图片 or 视频

转存 图片 or 视频

如果你需要微博正文中的图片 or 视频的话,那么你可以通过 Java 的方式获取图片 or 视频 内容,并转存到其他地方,这里我转存到本地电脑,整个 main 函数的代码如下 DemoWeiBoDown.java

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

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * dongao
 * 2024/5/20
 * 5月
 */
public class DemoWeiBoDown {
    public static void main(String[] args) {
        String imageUrl = "https://wx4.sinaimg.cn/orj360/001Q8zQmly1hpy4e694vyj60j60can2r02.jpg";
        String mp4Url = "https://locallimit.us.sinaimg.cn/o0/fn1ZOcw6lx08f0fwPoH601041200BRMn0E010.mp4?label=mp4_720p&template=1280x720.25.0&media_id=5036142555496496&tp=8x8A3El:7fHprYw&us=0&ori=1&bf=4&ot=h&lp=0000tfMx8&ps=mZ6WB&uid=66f6G2&ab=,8013-g0,3601-g36,3601-g27,3601-g27&Expires=1716201414&ssig=B05wQvtmef&KID=unistore,video";
        String filename = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);
        String filename2 = mp4Url.substring(mp4Url.lastIndexOf("/") + 1, mp4Url.indexOf("?"));
        downloadPicture(imageUrl, "E:\\2024weibo\\"+filename);
        downloadPicture(mp4Url, "E:\\2024weibo\\"+filename2);
    }

    /**
     * 下载图片到指定路径
     *
     * @param imageUrl 图片的URL地址
     * @param savePath 图片保存的本地路径
     */
    public static void downloadPicture(String imageUrl, String savePath){

        BufferedInputStream in = null;
        FileOutputStream out = null;
        HttpURLConnection connection = null;
        try {
            // 创建URL对象并打开连接
            URL url = new URL(imageUrl);
            connection = (HttpURLConnection) url.openConnection();
            // 设置请求方法为GET
            connection.setRequestMethod("GET");
            // 建立连接
            connection.connect();

            // 获取响应码并判断是否下载成功
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // 创建输入流和输出流,用于读取和保存图片
                in = new BufferedInputStream(connection.getInputStream());
                out = new FileOutputStream(savePath);

                // 缓冲区,用于一次读取和写入一定量的数据
                byte[] buffer = new byte[1024];
                int bytesRead;
                // 循环读取直到没有数据
                while ((bytesRead = in.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesRead);
                }
                System.out.println("图片/视频 下载成功,保存路径:" + savePath);
            } else {
                // 响应码不为HTTP_OK,下载失败
                System.out.println("无法下载图片/视频,响应码:" + responseCode);
            }

        }catch (Exception e) {
            // 捕获异常并打印堆栈信息
            e.printStackTrace();
        }finally {
            // 无论成功或失败,最后都关闭流和连接
            // 关闭输入流
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // 将IO异常转为运行时异常抛出
                    throw new RuntimeException(e);
                }
            }
            // 关闭输出流
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    // 将IO异常转为运行时异常抛出
                    throw new RuntimeException(e);
                }
            }
            // 关闭连接
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}

执行当前 main 方法可以看到如下输出情况

image.png

这里的视频 响应码 403 就是因为视频链接的有效期已经过了,更换视频链接地址尝试后如下

image.png

那么这时去到我们的本地文件夹就可以看到刚才转存成功的图片和视频了

image.png

到这里,关于转存微博正文内容中的图片 or 视频的操作就完成了,整个过程比较简单顺畅,当然如果你需要转存到云存储也是可以的,只是需要改造一下获取到图片流 or 视频流后的操作就可以了。

注意点

这里需要说明的是,本文主要是探索基于 Java 爬取微博正文内容图片 or 视频内容实现,以及转存操作,大家有需要的可以相互学习一下。但是注意不可用于非法用途,或者恶意的爬取图片内容等,远离“破坏计算机信息系统罪”,慎重!慎重!慎重!


相关文章
|
2月前
|
自然语言处理 Java 关系型数据库
Java|小数据量场景的模糊搜索体验优化
在小数据量场景下,如何优化模糊搜索体验?本文分享一个简单实用的方案,虽然有点“土”,但效果还不错。
44 0
|
2月前
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
152 22
|
6月前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
265 3
|
3月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
4月前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
4月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
103 4
|
5月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
137 21
|
5月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
178 7
|
5月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
547 1
|
5月前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
191 17