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

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.hqwc.cn/news/539508.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Frustum PointNets for 3D Object Detection from RGB-D Data(2018)

3D空间的几何和拓扑结构 直接在3D空间操作可以更自然的参数化以及捕捉 重复、平面、对称等几何结构 2. Related Work 3D Object Detection from RGB-D Data Front view image based methods&#xff08;只是介绍了一种表示方法&#xff09; Bird’s eye view based methods&a…

基于centos7的k8s最新版v1.29.2安装教程

k8s概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语&…

gcc编译初探

记录gcc便编译遇到的问题和积累的经验 文章目录 一、 编译命令编译过程 第二章 遇到问题一、编译的动态库无法正常运行1&#xff09;设置环境变量 LD_LIBRARY_PATH2&#xff09;使用rpath将共享库位置嵌入到程序3&#xff09;将so共享库添加到系统路径 第三章 实用命令一、ldd查…

RN滚动选择组件react-native-wheel-picker-android

安装组件 yarn add react-native-wheel-picker-android我这里的版本为"react-native-wheel-picker-android": "^2.0.6", 示例代码 import { useState } from react import { View } from react-native import { WheelPicker } from react-native-wheel-…

字节飞书前端实习面试

属于是被字节狠狠地拷打了。面试官人很好&#xff0c;让人感觉有很沉稳的感觉。问了一大堆关于底层的问题&#xff0c;属于是把我整麻了。 项目部分问的不多&#xff0c;主要问的都是一些前端涉及的底层知识&#xff0c;层层递进。 1.vue3的响应式是如何实现的 2.computed和wat…

mysql事务(MVCC机制:undo日志)(mysql执行过程:redo日志,Buffer Pool缓存池)

事务 目的&#xff1a;保证数据的最终一致性## 事务的目的 事务的4大特性&#xff08;ACID&#xff09; 1.原子性(Atomicity):由undo log日志来保证 2.一致性(Consistency):使用事务的最终目的&#xff0c;由业务代码正确逻辑保证,比如错误的try-catch 3.隔离性(Isolation):…

Unreal发布Android在刘海屏手机上不能全屏显示问题

Unreal 4.27发布Android在刘海屏手机上不能全屏显示问题 Android设置全屏刘海屏全屏设置4.27设置刘海屏在部分手机不能显示问题 Android设置全屏 AndroidManifest.xml文件配置 ...<activity android:name"com.epicgames.ue4.GameActivity" android:label"st…

钉钉魔法盒:解锁企业数字化转型新密码

在数字化的浪潮中&#xff0c;一家公司在企业团队管理和商场综合运营中致力于实现数字化转型。于是&#xff0c;该公司在与无雀科技商讨后&#xff0c;决定引入钉钉平台&#xff0c;不仅要打造商业地产平台&#xff0c;更要优化团队管理流程&#xff0c;提升组织运营效率。 针对…

学习JAVA的二十二天(基础)

目录 网络编程 三要素&#xff1a; IP InetAddress类 端口号 协议 UDP协议 TCP协议 前言&#xff1a;学习JAVA的第二十一天&#xff08;基础&#xff09;-CSDN博客 网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序,进行的数据传输。 三要素&#xff1a;…

使用Python进行自然语言处理(NLP):NLTK与Spacy的比较【第133篇—NLTK与Spacy】

使用Python进行自然语言处理&#xff08;NLP&#xff09;&#xff1a;NLTK与Spacy的比较 自然语言处理&#xff08;NLP&#xff09;是人工智能领域的一个重要分支&#xff0c;它涉及到计算机如何理解、解释和生成人类语言。在Python中&#xff0c;有许多库可以用于NLP任务&…

ACM记忆化DFS与基于优先队列的BFS

基本概念--记忆化DFS 使用数组保存已经算出来的值&#xff0c;在后续的计算中减少大量的重复计算&#xff0c;提高效率。&#xff08;用于dp不方便&#xff0c;但是搜索方便的情况&#xff0c;可以提升效率。&#xff09; eg. 记忆化dfs求解斐波那契数列 int dfs(int n) {if…

【Node.js从基础到高级运用】十二、身份验证与授权:JWT

身份验证与授权是现代Web应用中不可或缺的部分。了解如何在Node.js应用中实施这些机制&#xff0c;将使你能够构建更安全、更可靠的应用程序。本文将引导你通过使用JWT实现用户注册、登录和权限控制的过程。 JWT&#xff08;Json Web Token&#xff09; JWT是一种用于双方之间…