当前位置: 首页 > news >正文

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

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

  • 图片 or 视频
  • 转存 图片 or 视频
  • 注意点

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

图片 or 视频

对于微博正文来说,图片和视频不能同时存在,也就是说你的微博只能选择发9张以内的图片或者发1个视频,那么在爬取微博正文数据时,想要获取微博中的图片/视频该怎么操作呢?我们首先来看一下微博正文中图片或者视频的一些特点,选择任意一篇微博正文,利用浏览器工具选取任意一张图片
在这里插入图片描述
这里可以看到图片的链接。这里需要说明的是微博正文中的图片链接是做过防盗处理的,你直接复制图片链接到浏览器是无法打开的,但是你可以通过 Java 代码来转存 图片。
在这里插入图片描述
同样的方法,利用浏览器工具的抓取功能获取微博正文视频内容地址,视频内容是可以直接放在浏览器打开的,但是需要注意的是视频内容的链接地址有个有效期参数 Expires ,如果超过有效期再打开会提示 403 错误码
在这里插入图片描述
这里获取的视频链接地址通常是这样的

//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

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();// 设置请求方法为GETconnection.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 视频流后的操作就可以了。

注意点

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

本文为转移文章,原文地址:https://developer.aliyun.com/article/1515269

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python手写了个简易的豆瓣影评爬虫
  • 【消息中间件】RabbitMQ
  • NC设计LFU缓存结构
  • 鸿蒙OS试题
  • three.js 着色器学习 聚集地
  • Ubuntu 20.04 源码编译安装OpenCV 4.5
  • stm32启动文件
  • 信贷业务流程优化与风控系统深度集成
  • popen和fgets函数
  • 一道ssrf题目--Web-ssrfme
  • vue3 composition 模式下watch object
  • 软考架构-构件技术
  • 高亮你的文字:CSS ::selection 伪元素的魔法
  • 关于springboot对接通义千问大模型的尝试(一)
  • 【Docker】Docker 的基本概念和优势简介
  • 时间复杂度分析经典问题——最大子序列和
  • Angular 4.x 动态创建组件
  • dva中组件的懒加载
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java基本数据类型之Number
  • nodejs调试方法
  • Python十分钟制作属于你自己的个性logo
  • windows下使用nginx调试简介
  • 阿里云购买磁盘后挂载
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 每天一个设计模式之命令模式
  • 使用agvtool更改app version/build
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • linux 淘宝开源监控工具tsar
  • # 飞书APP集成平台-数字化落地
  • #大学#套接字
  • #图像处理
  • (bean配置类的注解开发)学习Spring的第十三天
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (九)信息融合方式简介
  • (七)c52学习之旅-中断
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四)库存超卖案例实战——优化redis分布式锁
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net MVC + EF搭建学生管理系统
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .net操作Excel出错解决
  • .NET关于 跳过SSL中遇到的问题
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET下ASPX编程的几个小问题
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .NET中使用Redis (二)
  • /bin/bash^M: bad interpreter: No such file or directory
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [.NET]桃源网络硬盘 v7.4
  • []T 还是 []*T, 这是一个问题
  • [20150321]索引空块的问题.txt
  • [20150629]简单的加密连接.txt