前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Java爬取微博数据(四) 获取 图片 or 视频

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

原创
作者头像
六月的雨在Tencent
发布2024-09-24 21:40:21
2210
发布2024-09-24 21:40:21
举报
文章被收录于专栏:创作是最好的自我投资

既然已经掌握了 基于 Java 爬取微博正文列表内容,爬取微博用户主页内容以及导出爬取到的微博数据、加载微博正文长文本等操作,那么你是否有疑问,微博中的图片和视频也想爬取,又该怎么做呢?那么下面讲述一下如何处理微博正文中的图片/视频等内容。

图片 or 视频

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

这里可以看到图片的链接。这里需要说明的是微博正文中的图片链接是做过防盗处理的,你直接复制图片链接到浏览器是无法打开的,但是你可以通过 Java 代码来转存 图片,因为你的 Java 代码在获取图片内容时是有你微博登录账户的 cookies 信息的,所以你可以通过 Java 代码来转存图片,后面讲讲述如何通过 Java 代码转存图片。

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

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

代码语言:html
复制
//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

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

转存 图片 or 视频

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

代码语言: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/9/20
 * 9月
 */
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 方法可以看到如下输出情况

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

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

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

写在最后

同样的,本文关于微博爬取内容的操作只是其中的一部分数据,这样主要就是为了方便大家更快速的阅读完文章,从而知道如何获取微博这方面的数据。方便大家学习阅读的同时,main 方法可以直接执行,如果提示 cookies 过期,大家可以在 浏览器 登录 微博账号后,F12 复制请求连接对应的请求参数 cookies 即可。

注意点

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图片 or 视频
  • 转存 图片 or 视频
  • 写在最后
  • 注意点
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档