Java 获取热搜并生成图片

效果图如下:
在这里插入图片描述

第一步获取热搜

  public List<String> getHotNews4(Integer size) {if (size <= 0 || StringUtils.isEmpty(size)) {return null;}try {//set 转listreturn new ArrayList<>(getHotNews(size));} catch (Exception e) {logger.error("抓取热点排行榜异常:", e);return null;}}public Set<String> getHotNews(int size) {try {List<NewsModel> list1 = grabBaiduHotNews();List<NewsModel> list2 = grabWeiBoHotNews();List<NewsModel> list3 = getDouYinHotNews();//40%的权重是百度,30%的权重是微博 ,30%的权重是抖音int l1 = size * 40 / 100;int l2 = size * 30 / 100;int l3 = size - l1 - l2;Set<String> set = new HashSet<>();if (list1.size() < l1) {l1 = list1.size();l2 = size - l1 - l2;}if (list2.size() < l2) {l2 = list2.size();l3 = size - l1 - l2;}if (list3.size() < l3) {l3 = list3.size();}int j = 0;for (j = 0; j < l1; j++) {set.add(list1.get(j).getTitle());// sb.append(list1.get(i).getTitle()).append("。");}for (int i = 0; i < l2; i++) {set.add(list2.get(i).getTitle());}for (int i = 0; i < l3; i++) {set.add(list3.get(i).getTitle());}if (set.size() < size) {int n = size - set.size();if ((list1.size() - l1) < n) {n = list1.size() - l1;}for (int i = 0; i < n; i++) {set.add(list1.get(++j).getTitle());}}return set;} catch (Exception e) {logger.error("抓取热点排行榜异常:", e);return null;}}/*** 抓取百度热点排行榜** @return*/public List<NewsModel> grabBaiduHotNews() {String url = "https://top.baidu.com/board?tab=realtime&sa=fyb_realtime_31065";List<NewsModel> list = new ArrayList<>();try {Document doc = Jsoup.connect(url).get();//标题Elements titles = doc.select(".c-single-text-ellipsis");//图片Elements imgs = doc.select(".category-wrap_iQLoo .index_1Ew5p").next("img");//内容Elements contents = doc.select(".hot-desc_1m_jR.large_nSuFU");//推荐图Elements urls = doc.select(".category-wrap_iQLoo a.img-wrapper_29V76");//热搜指数Elements levels = doc.select(".hot-index_1Bl1a");for (int i = 0; i < levels.size(); i++) {NewsModel o = new NewsModel();o.setTitle(titles.get(i).text().trim());o.setImg(imgs.get(i).attr("src"));o.setContent(contents.get(i).text().replaceAll("查看更多>", "").trim());o.setUrl(urls.get(i).attr("href"));
//                o.setLevel(levels.get(i).text().trim());list.add(o);}return list;} catch (IOException e) {logger.error("抓取百度热点排行榜异常:" + e.getMessage());}return null;}/*** 抓取微博热搜榜*/public List<NewsModel> grabWeiBoHotNews() {String url = "https://weibo.com/ajax/statuses/hot_band";String s = HttpUtil.get(url);WeiBoHot weiBoHot = JSON.parseObject(s, WeiBoHot.class);List<NewsModel> list = new ArrayList<>();for (WeiBoHot.WeiBo weiBo : weiBoHot.getData().getBand_list()) {NewsModel o = new NewsModel();o.setTitle(weiBo.getNote());o.setImg(weiBo.getMblog());o.setContent(weiBo.getWord());o.setUrl(weiBo.getWord_scheme());list.add(o);}return list;}public List<NewsModel> getDouYinHotNews() {try {String s = HttpUtils.get("https://www.iesdouyin.com/web/api/" +"v2/hotsearch/billboard/word/?reflow_source=reflow_page");List<NewsModel> list = new ArrayList<>();JSONArray jsonArray = JSON.parseObject(s).getJSONArray("word_list");for (int i = 0; i < jsonArray.size(); i++) {JSONObject jsonObject = jsonArray.getJSONObject(i);list.add(new NewsModel(jsonObject.getString("word")));}return list;} catch (Exception e) {logger.error("", e);}//防止空指针return new ArrayList<>();}

第二步生成图片

public class WordCodeUtil {private static final Logger logger = LoggerFactory.getLogger(WordCodeUtil.class);public static WordCloud getWordCode(List<String> words) {words.remove(words.size() - 1);FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();frequencyAnalyzer.setWordFrequenciesToReturn(600);frequencyAnalyzer.setMinWordLength(3);// 引入中文解析器frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());final List<WordFrequency> wordFrequencyList = frequencyAnalyzer.load(words);int i = words.size();for (String s : words) {wordFrequencyList.add(new WordFrequency(s, i--));}// 设置图片分辨率Dimension dimension = new Dimension(940, 400);// 创建词云对象WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);// 加载字体文件try (BufferedInputStream bis = getFileFromResource("LXGWWenKaiMono-Bold.ttf")) {Font font = Font.createFont(Font.TRUETYPE_FONT, bis);wordCloud.setKumoFont(new KumoFont(font));} catch (IOException e) {logger.error("加载字体文件失败!",e);} catch (FontFormatException e) {throw new RuntimeException(e);}// 设置词云样式wordCloud.setPadding(3);wordCloud.setColorPalette(new ColorPalette(new Color(0xed1941), new Color(0xf26522), new Color(0x845538),new Color(0x8a5d19), new Color(0x7f7522), new Color(0x5c7a29),new Color(0x1d953f), new Color(0x007d65), new Color(0x65c294)));wordCloud.setBackground(new RectangleBackground(dimension));wordCloud.setFontScalar(new SqrtFontScalar(12, 45));wordCloud.setBackgroundColor(new Color(255, 255, 255));// 生成词云wordCloud.build(wordFrequencyList);return wordCloud;}//返回Base64到览器public static String getWordCloud2(List<String> words){return BufferedImageToBase64(getWordCode(words).getBufferedImage());}public static void getWordCloud3(List<String> words ,HttpServletResponse response) throws IOException {WordCloud wordCloud = getWordCode(words);wordCloud.writeToStreamAsPNG(response.getOutputStream());response.flushBuffer();}/*** 方法六:使用Hutool的ResourceUtil* 备注:jar包可用** @param fileName* @return* @throws IOException*/public static BufferedInputStream getFileFromResource(String fileName) throws IOException {List<URL> resources = ResourceUtil.getResources(fileName);URL resource = resources.get(0);return new BufferedInputStream(resource.openStream());}/*** BufferedImage 编码转换为 base64* @param bufferedImage* @return*/private static String BufferedImageToBase64(BufferedImage bufferedImage) {ByteArrayOutputStream bao = new ByteArrayOutputStream();//io流try {ImageIO.write(bufferedImage, "png", bao);//写入流中} catch (IOException e) {logger.error(e.getMessage(),e);}byte[] bytes = Base64.getEncoder().encode(bao.toByteArray());String base64 = new String(bytes);base64 = base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\nreturn "data:image/png;base64," + base64;}
}

完整代码可访问https://github.com/KingJin-web/open_api 获取

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

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

相关文章

Java 集合 Collection常考面试题

理解集合体系图 collection中 list 是有序的,set 是无序的 什么是迭代器 主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。 ArrayList 和 Vector 的区别? ArrayList 可以存放 null,底层是由数…

Java控制台实现《多线程模拟龟兔赛跑》(实现Runnale接口,重写run()方法)

&#xff08;温馨提示&#xff1a;本题最重要的是学习思路&#xff0c;代码还有待优化和改进&#xff01;&#xff09; 下一篇博客进行优化。实现Callable接口&#xff1a;V call() throws Exception 。可以返回结果&#xff0c;以及可以抛出异常。&#xff08;启动线程比较麻烦…

JavaSE——集合2:List(Iterator迭代器、增强for、普通for循环遍历集合)

目录 一、List (一)List接口基本介绍 二、List接口的常用方法 三、List集合的三种遍历方式 四、小练习——使用冒泡排序遍历集合 一、List (一)List接口基本介绍 List接口是Collection接口的子接口 public interface List<E> extends Collection<E> List集…

Matlab实现海洋捕食者优化算法优化回声状态网络模型 (MPA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海洋捕食者优化算法&#xff08;Marine Predators Algorithm, MPA&#xff09;是一种基于海洋生物捕食行为的新型群体智能优化算法。MPA通过模拟海洋捕食者如鲨鱼、海豚等在寻找猎物时的追踪、包围和攻击行为&…

高质量SCI论文撰写及投稿丨论文选题、文献调研、实验设计、数据分析、论文结构及语言规范等----AI强大功能

科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。系统掌握从选题到投稿的全过程&#xff0c;提高论文撰写效率与…

区块链积分系统:重塑支付安全与商业创新的未来

在当今社会&#xff0c;数字化浪潮席卷全球&#xff0c;支付安全与风险管理议题日益凸显。随着交易频次与规模的不断扩大&#xff0c;传统支付体系正面临前所未有的效率、合规性和安全挑战。 区块链技术&#xff0c;凭借其去中心化、高透明度以及数据不可篡改的特性&#xff0c…

React(一) 认识React、熟悉类组件、JSX书写规范、嵌入变量表达式、绑定属性

文章目录 一、初始React1. React的基本认识2. Hello案例2.1 三个依赖2.2 渲染页面2.3 hello案例完整代码 二、类组件1. 封装类组件2. 组件里的数据3. 组件里的函数 (重点)4. 案例练习(1) 展示电影列表 三、JSX语法1. 认识JSX2. JSX书写规范及注释3. JSX嵌入变量作为子元素4. JS…

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

【gRPC】4—gRPC与Netty

gRPC与Netty ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; &#x1f4d6;RPC专栏&#xff1a;https://…

力扣 前缀和

找子数组的个数了解前缀和的基础。 前缀和大致理解为到达某个位置&#xff0c;前面几个数的总和&#xff0c;即s[i1]s[i]a[i1]&#xff0c;可以通过一次循环获得。然后几个前缀和作差&#xff0c;即可得到某个位置到某个位置的和&#xff0c;根据map的键值对进行更新次数。 题…

opencv实战项目(三十一):基于同态滤波的图像亮度提升

文章目录 前言一、同态滤波二、算法实现 前言 在数字图像处理领域&#xff0c;图像亮度的调整是一项基本且至关重要的技术。它不仅关系到图像的视觉效果&#xff0c;而且在许多实际应用中&#xff0c;如医疗影像分析、卫星遥感监测、视频监控系统等&#xff0c;都扮演着关键角…

基于STM32 ARM+FPGA+AD的电能质量分析仪方案设计(一)硬件设计

电能质量分析系统硬件设计 3.1 电能质量分析系统设计要求 本系统实现对电能质量的高精度测量&#xff0c;根据国家相关电能质量分析仪器规定 标准以及对市场电能质量分析仪的分析&#xff0c;指定以下设计目标。 &#xff08; 1 &#xff09;电能质量参数测量精度&#xf…

欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值

目前链上数据正处于迈向下一个爆发的重要时刻。 随着Web3行业发展&#xff0c;公链数量呈现爆发式的增长&#xff0c;链上积聚的财富效应&#xff0c;特别是由行业热点话题引领的链上交互行为爆发式增长带来了巨量的链上数据&#xff0c;这些数据构筑了一个行为透明但与物理世…

【部署篇】Redis-01介绍‌

一、Redis介绍‌ 1、什么是Redis&#xff1f; ‌Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统&#xff0c;支持网络、可基于内存亦可持久化。‌ 它提…

leetcode hot100_part3_滑动窗口

滑动窗口是有一个基本的模版的&#xff0c;不要自己想当然哦~ 滑动窗口算法思想&#xff08;附经典例题&#xff09;_滑动窗口的思想-CSDN博客 滑动窗口也叫同向双指针&#xff1b;可以先看一下灵山视频&#xff1a;滑动窗口【基础算法精讲 03】_哔哩哔哩_bilibili 3.无重复字…

【unity进阶知识12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档

文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

安卓使用.9图实现阴影效果box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);

1.安卓实现阴影效果有很多种&#xff0c;一般UX设计会给以H5参数box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);这种方式提供背景阴影效果&#xff0c;这里记录一下实现过程 2.界面xml源码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns…

【SEO】什么是SEO?

什么是SEO&#xff08;搜索引擎优化&#xff09;&#xff1f;为什么SEO对于⼀个⽹站⾄关重要&#xff1f; SEO 全称是搜索引擎优化&#xff08;Search Engine Optimization&#xff09; 因为我们目前开发的网址&#xff0c;需要人看到&#xff0c;除了通过宣传营销的方式展现…

kubernetes中微服务部署

微服务 问&#xff1a;用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 答&#xff1a;需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service&#xff0c;应用可以实现服务发现和负载均衡Service 默认只…