Java 获取热搜并生成图片

news2024/11/27 4:30:50

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

第一步获取热搜

  public List<String> getHotNews4(Integer size) {
        if (size <= 0 || StringUtils.isEmpty(size)) {
            return null;
        }
        try {
            //set 转list
            return 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\n
        return "data:image/png;base64," + base64;
    }
}

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

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

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

相关文章

如何基于审批实现文件外发管控,阻断数据违规外流?

FTP可以说是实际中企业运用最广泛的文件传输方式&#xff0c;很多企业不仅内部传输文件使用FTP&#xff0c;在与外部合作伙伴协作时&#xff0c;也多采用FTP进行文件的外发和收取。例如半导体行业&#xff0c;默认的都是使用FTP进行文件外发&#xff0c;这时候&#xff0c;替换…

卷积神经网络细节问题及知识点

一、Batch Normalization Batch Normalization&#xff08;BN&#xff0c;批归一化&#xff09; 是深度学习中的一种技术&#xff0c;主要用于加速神经网络的训练过程&#xff0c;同时提高网络的稳定性和收敛速度。它通过对每一层的输出进行归一化&#xff0c;减少梯度消失和梯…

本地部署Docsify生成文档网站并实现公网环境远程访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…

ubuntu22.04 安装wine9.0 全网首发

wine官网推荐安装方式&#xff1a;https://gitlab.winehq.org/wine/wine/-/wikis/zh_CN/Debian-Ubuntu 博主按照这种方式是失败的&#xff0c;虽然开启了“低调上网”&#xff0c;貌似代理对于终端不起作用&#xff0c;后面会介绍替代方案&#xff0c;一样完美。 一、官网的安…

Pycharm里设置关于designer.exe以及pyuic5.exe的外部工具

文章目录 1.Pycharm与Pyuic5介绍(1)Pycharm(2)Pyuic5 2.Pycharm里设置外部工具(1)切换到外部工具(2)designer创建外部工具(3)pyuic5创建外部工具(4)使用designer和pyuic5 3.本章总结 1.Pycharm与Pyuic5介绍 (1)Pycharm Pycharm是专门用于python编程语言的编辑软件&#xff0c;…

QT的核心机制 对话框资源

案例 1、键盘按下w&#xff0c;s&#xff0c;a&#xff0c;d键分别为标签向上&#xff0c;下&#xff0c;左&#xff0c;右移动 鼠标按下获取本地坐标&#xff0c;全局坐标 鼠标双击获取本地坐标&#xff0c;全局坐标 鼠标移动获取本地坐标&#xff0c;全局坐标 让鼠标跟踪…

C语言 ——— oj题:有效的括号

目录 题目要求 代码实现 题目要求 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…

【靶点Talk】为什么联合用药喜欢用VEGF+VEGFR?

血管生成对肿瘤发生、发展的重要影响的发现&#xff0c;使肿管生成变为肿瘤研究的热点之一。今天给大家带来VEGF、VEGFR相关介绍&#xff0c;更多靶点科普视频请关注义翘神州B站和知乎官方账号。 1、VEGFR的“简历” VEGFR包括VEGFR-1、VEGFR-2和VEGFR-3。VEGFR-2可与多种VEGF…

leetcode hot100_part03_滑动窗口

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

springboot如何自动生成mybatis映射文件、dao、pojo层文件?

背景&#xff1a;以前一直是直接cv一个项目中现成的xml文件&#xff0c;然后再去自己配置mapper等数据。自己准备做一个单独的例子试一下。 步骤1&#xff1a;在pom.xml文件中插入mybatis-generator插件&#xff0c;这里选的版本是1.3.2&#xff0c;然后指定的generator文件是在…

ChatGPT 4o with Canvas — 新特性详解

# ChatGPT 4o with Canvas — 新特性详解 最近猫哥也感受到 Canvas 的强大&#xff0c;顺手开了个会员体验了一天&#xff0c;今天给大家简单分享一下&#xff0c;有想体验的伙伴可以文末名片私信我哈&#xff01; 关键词&#xff1a; #ChatGPT4o #Canvas新特性 #AI写作工具 …

[论文笔记]DAPR: A Benchmark on Document-Aware Passage Retrieval

引言 今天带来论文DAPR: A Benchmark on Document-Aware Passage Retrieval的笔记。 本文提出了一个基准&#xff1a;文档感知段落检索(Document-Aware Passage Retrieval,DAPR)以及介绍了一些上下文段落表示的方法。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c…

Best HTTP V3

Best HTTP是Unity的权威网络解决方案,专为需要多功能性和强大功能的开发人员而设计。它与Unity 2021.1及更高版本无缝兼容,提供无与伦比的跨平台支持,包括桌面、移动设备、UWP和Web浏览器。凭借其高级功能集,它超越了基本的HTTP请求,支持HTTPS、HTTP/2,并通过传统的回调、…

2024年10月11日历史上的今天大事件早读

1038年10月11日李元昊称帝&#xff0c;国号大夏&#xff0c;西夏建立 1086年10月11日北宋政治家、史学家司马光逝世 1889年10月11日英国物理学家焦耳逝世 1900年10月11日李鸿章开始与八国联军的艰难谈判 1937年10月11日淞沪战线大场之战爆发 1944年10月11日日军包围桂林 …

The 2024 ICPC Kunming Invitational Contest K. Permutation(交互 期望)

在知乎内查看 题目 思路来源 题解 首先特判n1的情况&#xff0c;其实也不用问 分治&#xff0c;假设当前解决到[l,r]&#xff0c;要递归的vector是x&#xff0c; 维护两个vector L、R&#xff0c;代表下一步要在[l,mid]和[mid1,r]分治的vector 每次将x random_shuffle后&a…

网络安全 IP地址防泄漏指南

IP地址作为每个上网人的“门牌标识号”&#xff0c;如果产生泄露&#xff0c;可能会导致个人行踪曝光、数据被窃取甚至遭受网络攻击&#xff0c;要防止IP地址不被窃取&#xff0c;我们可以尝试以下方法&#xff1a; 利用专用网络加强隐私保护 通过加密在公共网络上创建一条安全…

力扣 前缀和

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

博客项目自动化测试(一)

1. 确认博客系统的环境搭建 http://49.235.129.183:8080/java109_blog_system/blog_list.html&#xff0c;即可访问我的小项目&#xff1b; 2. 确定测试用例 测试用例如下所示&#xff1a; 3. 关于登录的测试用例 3.1 初始化和退出浏览器 代码如下&#xff1a; package Blo…

查缺补漏----二进制指数退避算法的流程

具体为以下几步&#xff1a; 例题&#xff1a; ① 争用时间片2t51.2us ② kmin{重传次数&#xff0c;10}&#xff0c;题目说4次冲突&#xff0c;所以k为4&#xff0c;对应参数集合为&#xff1a; {0&#xff0c;1&#xff0c;2&#xff0c;......} ③ 等待的最长时间&#xff1…

PHP学习记录-编辑器推荐和本地环境的安装

文章目录 一&#xff0c;编辑器首推VSCode1&#xff0c;vscode2&#xff0c;PHPStorm 二&#xff0c;PHP环境搭建1&#xff0c;下载安装2&#xff0c;使用phpstudy创建站点3&#xff0c;答疑解惑 一&#xff0c;编辑器首推VSCode 1&#xff0c;vscode 对于PHP新手来说&#x…