Java实现知乎热点小时榜爬虫

news/2025/3/13 7:53:16/

1.效果演示

1.1 热点问题列表

启动程序后,自动展示热点问题,并等待终端输入
在这里插入图片描述

1.2 根据序号选择想看的热点问题

输入问题序号,展示回答内容
在这里插入图片描述

1.3 退出

输入q即可退出程序
在这里插入图片描述

2.源码

2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>zhihu</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.9.0</version></dependency></dependencies></project>

2.2 Java代码

package org.example;import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;public class ZhihuHotHourCrawler {final static String ZHIHU_HOT_URL = "https://www.zhihu.com/api/v4/creators/rank/hot?domain=0&period=hour";final static String QUESTION_HTML_MATCH_PREFIX = "<script id=\"js-initialData\" type=\"text/json\">";final static String QUESTION_HTML_MATCH_SUFFIX = "</script>";public static String getHtml(String urlString) {StringBuffer response = new StringBuffer();URL url = null;try {url = new URL(urlString);URLConnection connection = url.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();} catch (Exception e) {e.printStackTrace();}return response.toString();}public static void parseHotHtml(String hotHtml, Map<String, String> titleAndUrl, Map<String, String> indexAndTitle) {// 解析知乎小时榜页HTML,返回所有热搜问题标题和问题链接Gson gson = new Gson();JsonObject jsonObject = gson.fromJson(hotHtml, JsonObject.class);int index = 1;for (JsonElement item : jsonObject.get("data").getAsJsonArray()) {JsonObject question = item.getAsJsonObject().get("question").getAsJsonObject();String questionUrl = question.get("url").getAsString();String questionTitle = question.get("title").getAsString();titleAndUrl.put(questionTitle, questionUrl);indexAndTitle.put(String.valueOf(index), questionTitle);index++;}}public static String removeHtmlTag(String content) {StringBuilder sb = new StringBuilder(content);while (true) {int tagStartIndex = sb.indexOf("<");if (tagStartIndex < 0) {return sb.toString();}int tagEndIndex = sb.indexOf(">", tagStartIndex);sb.delete(tagStartIndex, tagEndIndex + 1);}}public static void parseQuestionHtml(String questionHtml) {int prefixIndex = questionHtml.indexOf(QUESTION_HTML_MATCH_PREFIX);int suffixIndex = questionHtml.indexOf(QUESTION_HTML_MATCH_SUFFIX, prefixIndex);String jsonStr = questionHtml.substring(prefixIndex + QUESTION_HTML_MATCH_PREFIX.length(), suffixIndex);// 解析知乎问题页HTML,输出问题对应的回答内容Gson gson = new Gson();JsonObject jsonObject = gson.fromJson(jsonStr, JsonObject.class);JsonObject answers = jsonObject.get("initialState").getAsJsonObject().get("entities").getAsJsonObject().get("answers").getAsJsonObject();int answerNum = 1;for (String answerId : answers.keySet()) {JsonObject answer = answers.get(answerId).getAsJsonObject();String content = answer.get("content").getAsString();String finalContent = removeHtmlTag(content);System.out.println("A" + answerNum + ": " + finalContent);answerNum++;}}public static void main(String[] args) {String hotHtml = getHtml(ZHIHU_HOT_URL);Map<String, String> titleAndUrl = new LinkedHashMap<>();Map<String, String> indexAndTitle = new LinkedHashMap<>();parseHotHtml(hotHtml, titleAndUrl, indexAndTitle);for (String key : indexAndTitle.keySet()) {System.out.println(key + "." + indexAndTitle.get(key));}while (true) {Scanner scanner = new Scanner(System.in);System.out.print("请输入序号:");String nextLine = scanner.nextLine();if (nextLine.equals("q")) {break;} else {String questionUrl = titleAndUrl.get(indexAndTitle.get(nextLine));String questionHtml = getHtml(questionUrl);parseQuestionHtml(questionHtml);}}}
}

3.补充

如果不好使了,可以留言,我更新一下代码(如果有时间的话😂)。


http://www.ppmy.cn/news/1389723.html

相关文章

JAVA 100道题(6)

6.创建一个表示矩形的类&#xff0c;包括宽度和高度属性&#xff0c;以及计算面积和周长的方法。 下面是一个简单的Python类&#xff0c;表示矩形&#xff0c;包含宽度和高度属性&#xff0c;以及计算面积和周长的方法&#xff1a; python复制代码 class Rectangle: def __ini…

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个&#xff08;Liu&#xff0c;2015&#xff09;。华为为此次转型成立了一个专门的团队&#xff0c;从大约20人开始&#xff0c;他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

【RabbitMQ】【Docker】基于docker-compose构建rabbitmq容器

本文通过docker-compose构建一个单体的rabbtimq容器。 1&#xff0c;docker、docker-compose环境 首先需要有docker和docker-compose环境&#xff0c;docker安装[1]&#xff0c;docker-compose安装[2]。 通过下列命令确定docker、docker-compose是否安装成功。 [root192 ge…

踏“时间”与“空间”前来探寻复杂度的奥妙(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

【机器学习系列】M3DM工业缺陷检测部署与训练

一.基础资料 1.Git 地址 地址 2.issues issues 3.参考 参考 csdn 二.服务器信息 1.GPU 服务器 GPU 服务器自带 CUDA 安装(前提是需要勾选上)CUDA 需要选择大于 11.3 的版本登录服务器后会自动安装 GPU 驱动 2.CUDA 安装 GPU 服务器自带 CUDA CUDA 版本查看 3.登录信…

什么是零日攻击?

一、零日攻击的概念 零日攻击是指利用零日漏洞对系统或软件应用发动的网络攻击。 零日漏洞也称零时差漏洞&#xff0c;通常是指还没有补丁的安全漏洞。由于零日漏洞的严重级别通常较高&#xff0c;所以零日攻击往往也具有很大的破坏性。 目前&#xff0c;任何安全产品或解决方案…

蓝桥杯第14届模拟赛最大连通分块(dfs)

问题描述(答案148)   小蓝有一个 30 行 60 列的数字矩阵&#xff0c;矩阵中的每个数都是 0 或 1 。 110010000011111110101001001001101010111011011011101001111110 010000000001010001101100000010010110001111100010101100011110 001011101000100011111111111010000010010…

GIS学习

匹配查询&#xff0c;先连接两个表&#xff0c;然后在一个表里面查询 合并两个形状 比较好的colormap http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html https://docs.gmt-china.org/latest/cpt/builtin-cpt/ 计算坡度时就要捕捉栅格 重分类时也要捕捉栅…