admin 管理员组文章数量: 1184232
昨天晚上刷着 GitHub,偶然发现了一个有趣的项目——DailyHot。说它有趣,是因为这个项目做的事情看似简单却很有价值:把全网几十个平台的热榜信息聚合到一起。更让我兴奋的是,这个项目不仅提供了 Web 界面让你直接浏览,还开放了 API 接口供开发者调用。作为一个技术爱好者,我当然忍不住要深度体验一番,这一试不要紧,发现了一个完全不同的方式获取信息。
部署好 DailyHot 镜像后,我发现这个服务跑在两个端口上:一个是 Web 界面端口,可以直接在浏览器里查看各个平台的热榜(80端口);另一个是 API 服务端口 6688,这才是真正让我兴奋的地方。作为一个喜欢折腾的程序员,API 意味着无限的可能性——我可以基于这些数据接口做任何我想做的事情。
1.Web 端展示:信息聚合的简洁美学
打开 Web 界面的那一刻,我有种"这就是我需要的"的感觉。页面设计很简洁,没有花里胡哨的装饰,就是纯粹的信息展示。GitHub、微博、知乎、掘金、B站等等,54 个平台整整齐齐地排列着。点击任何一个平台,就会跳转到该平台的实时热榜数据。
这种体验让我想起了早期互联网的那种纯粹感。没有广告,没有推荐算法的干扰,没有各种弹窗提醒,就是你想看什么就点什么。特别是当我需要快速了解前沿热点技术趋势时,能够在各大技术论坛之间快速切换,这种效率提升是显而易见的。
每个热点条目都包含标题、热度排名和链接,信息密度恰到好处。不会因为信息太少而缺乏参考价值,也不会因为信息太多而造成认知负担。点击标题就能直接跳转到原文,整个信息获取的链路非常流畅。更重要的是,这些数据每 60 分钟更新一次,既保证了时效性,又避免了过于频繁的刷新对服务器造成压力。
但真正让我激动的还不是Web界面,而是发现这个服务同时开放了 API 接口。当我在浏览器地址栏输入 API 地址,看到返回的 JSON 数据时,我知道有趣的事情要开始了。
2.API 接口实战:从数据到洞察的技术之旅
2.1 API 接口调用测试脚本
API 的设计非常简洁和合理,
/all
可以获取所有支持的平台列表,
/{platform}
可以获取具体平台的热榜数据。我迫不及待地开始编写代码来探索这些数据的潜力。
首先是最基础的连通性测试。我写了一个简单的脚本来验证 API 的可用性:
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""
DailyHot API 基础测试
"""import requests
import json
from datetime import datetime
# =============================================# 重要提示:请替换为你的实际服务地址(云端或本地)# =============================================
API_BASE_URL =""deftest_api_connection():"""测试API连接"""print("DailyHot API 测试开始")print("="*50)try:# 测试获取所有路由print("获取所有支持的平台...")
response = requests.get(f"{API_BASE_URL}/all", timeout=10)if response.status_code ==200:
data = response.json()
routes = data.get('routes',[])print(f"成功获取到 {len(routes)} 个平台")# 显示前10个平台print("\n支持的平台 (前10个):")for i, route inenumerate(routes[:10],1):print(f" {i:2d}. {route['name']}")iflen(routes)>10:print(f" ... 还有 {len(routes)-10} 个平台")else:print(f"API连接失败: HTTP {response.status_code}")returnFalseexcept Exception as e:print(f"连接异常: {e}")returnFalsereturnTruedeftest_github_data():"""测试获取GitHub热榜数据"""print("\n"+"="*50)print("测试GitHub热榜数据")try:
response = requests.get(f"{API_BASE_URL}/github", timeout=10)if response.status_code ==200:
data = response.json()if data.get('code')==200:
items = data.get('data',[])
update_time = data.get('updateTime','N/A')print(f"成功获取 {len(items)} 条GitHub热榜数据")print(f"更新时间: {update_time}")print("\nGitHub热榜TOP5:")print("-"*60)for i, item inenumerate(items[:5],1):
title = item.get('title','N/A')
hot = item.get('hot','N/A')
url = item.get('url','N/A')print(f"{i}. {title}")print(f" Stars: {hot} | 链接: {url[:50]}...")print()else:print(f"API返回错误: {data}")else:print(f"请求失败: HTTP {response.status_code}")except Exception as e:print(f"获取GitHub数据异常: {e}")deftest_multiple_platforms():"""测试多个平台数据获取"""print("\n"+"="*50)print("测试多平台数据获取")# 测试这些热门平台
test_platforms =['weibo','zhihu','juejin','bilibili','ithome']for platform in test_platforms:try:print(f"正在测试 {platform.upper()}...")
response = requests.get(f"{API_BASE_URL}/{platform}", timeout=10)if response.status_code ==200:
data = response.json()if data.get('code')==200:
items = data.get('data',[])print(f" 成功 {platform}: {len(items)} 条热点")else:print(f" 失败 {platform}: API返回错误")else:print(f" 失败 {platform}: HTTP {response.status_code}")except Exception as e:print(f" 失败 {platform}: 异常 {e}")deftest_keyword_search():"""测试关键词搜索"""print("\n"+"="*50)print("测试关键词搜索")
keywords =['AI','Python','JavaScript']
test_platforms =['github','juejin','zhihu']for keyword in keywords:print(f"\n搜索关键词: {keyword}")
found_count =0for platform in test_platforms:try:
response = requests.get(f"{API_BASE_URL}/{platform}", timeout=10)if response.status_code ==200:
data = response.json()if data.get('code')==200:
items = data.get('data',[])# 搜索包含关键词的标题
matching_items =[]for item in items:
title = item.get('title','').lower()if keyword.lower()in title:
matching_items.append(item)if matching_items:print(f" {platform}: 找到 {len(matching_items)} 条相关内容")for item in matching_items[:2]:# 只显示前2条print(f" • {item.get('title','N/A')[:50]}...")
found_count +=len(matching_items)else:print(f" {platform}: 无相关内容")except Exception as e:print(f" {platform}: 搜索异常 {e}")print(f" 关键词 '{keyword}' 总共找到 {found_count} 条相关内容")defmain():"""主函数"""print(f"测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")# 测试API连接ifnot test_api_connection():print("API连接失败,终止测试")return# 测试GitHub数据
test_github_data()# 测试多平台数据
test_multiple_platforms()# 测试关键词搜索
test_keyword_search()print("\n"+"="*50)print("测试完成!")print("API工作正常,可以开始使用更复杂的应用场景")if __name__ =="__main__":
main()测试时间:2025-06-1811:36:45
DailyHot API 测试开始
==================================================
获取所有支持的平台...
成功获取到 54 个平台
支持的平台(前10个):1.36kr
2.51cto
3.52pojie
4. acfun
5. baidu
6. bilibili
7. coolapk
8. csdn
9. dgtle
10. douban-group
... 还有 44 个平台
==================================================
测试GitHub热榜数据
成功获取 8 条GitHub热榜数据
更新时间:2025-06-18T03:36:47.797Z
GitHub热榜TOP5:------------------------------------------------------------1. fluentui-system-icons
Stars:8,224| 链接: https://github.com/microsoft/fluentui-system-icons...2. jan
Stars:30,876| 链接: https://github.com/menloresearch/jan...3. anthropic-cookbook
Stars:14,742| 链接: https://github.com/anthropics/anthropic-cookbook...4. ragflow
Stars:56,478| 链接: https://github.com/infiniflow/ragflow...5. DeepEP
Stars:7,885| 链接: https://github.com/deepseek-ai/DeepEP...==================================================
测试多平台数据获取
正在测试 WEIBO...
成功 weibo:51 条热点
正在测试 ZHIHU...
失败 zhihu:HTTP503
正在测试 JUEJIN...
成功 juejin:50 条热点
正在测试 BILIBILI...
成功 bilibili:100 条热点
正在测试 ITHOME...
成功 ithome:48 条热点
==================================================
测试关键词搜索
搜索关键词:AI
github: 无相关内容
juejin: 找到 4 条相关内容
• 看我如何用AI做一款⌈黄金矿工⌋小游戏...
• Python :AI 太牛了 ,撸了两个 Markdown 阅读器 ,谈谈使用感受...
关键词 'AI' 总共找到 4 条相关内容
搜索关键词: Python
github: 无相关内容
juejin: 找到 1 条相关内容
• Python :AI 太牛了 ,撸了两个 Markdown 阅读器 ,谈谈使用感受...
关键词 'Python' 总共找到 1 条相关内容
搜索关键词: JavaScript
github: 无相关内容
juejin: 找到 3 条相关内容
• 从 npm 到 Yarn 到 pnpm:JavaScript 包管理工具的演进之路...
• 倒反天罡,CSS 中竟然可以写 JavaScript...
关键词 'JavaScript' 总共找到 3 条相关内容
==================================================
测试完成!
API工作正常,可以开始使用更复杂的应用场景
运行结果让人满意:API 成功返回了 54 个平台的路由信息,GitHub 热榜也能正常获取。在性能测试中,各个平台的响应时间都很理想,微博 69ms、掘金 82ms、GitHub 73ms,基本都能在 150ms 内完成响应。
2.2 API 接口热点分析程序示例
有了稳定的 API 基础,我开始尝试更有趣的应用场景。这是我利用 cursor 完成的一套调用 DailyHot API 接口的各大平台热点分析程序。只需要运行这一个程序,就能把全网54个主流平台的热点尽收眼底,还能深度挖掘背后的价值。
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""
各大平台热点分析程序
该程序用于获取和分析各大平台的热点数据,包括:
- 数据获取:从DailyHot API获取各平台热点数据
- 数据分析:统计热点标题、热度分布等
- 结果展示:生成分析报告
- 数据导出:支持JSON、CSV等格式导出
作者:AI Assistant
版本:1.0
"""import requests
import json
import csv
import time
import os
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Tuple
import logging
from concurrent.futures import ThreadPoolExecutor, as_completed
import re
from collections import Counter, defaultdict
import random
import math
# 配置日志
logging.basicConfig(
level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('hot_analysis.log', encoding='utf-8'),
logging.StreamHandler()])
logger = logging.getLogger(__name__)classHotAnalyzer:"""热点数据分析器
主要功能:
1. 从DailyHot API获取各平台热点数据
2. 分析热点内容的统计特征
3. 生成分析报告
4. 导出分析结果
"""# =============================================# 重要提示:请替换为你的实际服务地址(云端或本地)# =============================================def__init__(self, base_url:str=""):"""初始化热点分析器
Args:
base_url (str): API基础URL地址
"""
self.base_url = base_url.rstrip('/')
self.session = requests.Session()
self.session.timeout =30
self.session.headers.update({'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'})# 平台路由配置(从API获取的54个平台)
self.platforms ={"36kr":"36氪","51cto":"51CTO","52pojie":"吾爱破解","acfun":"AcFun","baidu":"百度","bilibili":"哔哩哔哩","coolapk":"酷安","csdn":"CSDN","dgtle":"数字尾巴","douban-group":"豆瓣小组","douban-movie":"豆瓣电影","douyin":"抖音","earthquake":"地震速报","geekpark":"极客公园","genshin":"原神","github":"GitHub","guokr":"果壳","hackernews":"Hacker News","hellogithub":"HelloGitHub","history":"历史上的今天","honkai":"崩坏3","hostloc":"全球主机交流论坛","hupu":"虎扑","huxiu":"虎嗅","ifanr":"爱范儿","ithome-xijiayi":"IT之家喜加一","ithome":"IT之家","jianshu":"简书","juejin":"掘金","kuaishou":"快手","linuxdo":"LinuxDo","lol":"英雄联盟","miyoushe":"米游社","netease-news":"网易新闻","ngabbs":"NGA","nodeseek":"NodeSeek","nytimes":"纽约时报","producthunt":"Product Hunt","qq-news":"腾讯新闻","sina-news":"新浪新闻","sina":"新浪","smzdm":"什么值得买","sspai":"少数派","starrail":"崩坏:星穹铁道","thepaper":"澎湃新闻","tieba":"百度贴吧","toutiao":"今日头条","v2ex":"V2EX","weatheralarm":"天气预警","weibo":"微博","weread":"微信读书","yystv":"游研社","zhihu-daily":"知乎日报","zhihu":"知乎"}# 数据存储
self.hot_data ={}
self.analysis_results ={}defget_platform_data(self, platform_key:str)-> Optional[Dict]:"""获取单个平台的热点数据
Args:
platform_key (str): 平台标识符
Returns:
Optional[Dict]: 热点数据,获取失败返回None
"""try:
url =f"{self.base_url}/{platform_key}"
logger.info(f"正在获取 {self.platforms.get(platform_key, platform_key)} 的热点数据...")
response = self.session.get(url)
response.raise_for_status()
data = response.json()# 验证数据结构if'code'in data and data['code']==200and'data'in data:
logger.info(f"成功获取 {self.platforms.get(platform_key, platform_key)} 数据,共 {len(data['data'])} 条")return data
else:
logger.warning(f"{self.platforms.get(platform_key, platform_key)} 数据格式异常")returnNoneexcept requests.RequestException as e:
logger.error(f"获取 {self.platforms.get(platform_key, platform_key)} 数据失败: {e}")returnNoneexcept json.JSONDecodeError as e:
logger.error(f"解析 {self.platforms.get(platform_key, platform_key)} 数据失败: {e}")returnNonedefget_all_platforms_data(self, max_workers:int=10, selected_platforms: Optional[List[str]]=None)-> Dict:"""并发获取所有平台热点数据
Args:
max_workers (int): 最大并发线程数
selected_platforms (Optional[List[str]]): 指定获取的平台列表,None表示获取所有平台
Returns:
Dict: 所有平台的热点数据
"""
platforms_to_fetch = selected_platforms if selected_platforms elselist(self.platforms.keys())
logger.info(f"开始获取 {len(platforms_to_fetch)} 个平台的热点数据...")with ThreadPoolExecutor(max_workers=max_workers)as executor:# 提交所有任务
future_to_platform ={
executor.submit(self.get_platform_data, platform): platform
for platform in platforms_to_fetch
}# 收集结果for future in as_completed(future_to_platform):
platform = future_to_platform[future]try:
data = future.result()if data:
self.hot_data[platform]= data
except Exception as e:
logger.error(f"处理 {platform} 数据时发生错误: {e}")
logger.info(f"数据获取完成,成功获取 {len(self.hot_data)} 个平台的数据")return self.hot_data
defanalyze_hot_content(self)-> Dict:"""分析热点内容
Returns:
Dict: 分析结果
"""
logger.info("开始分析热点内容...")
analysis ={'platform_stats':{},# 各平台统计'title_analysis':{},# 标题分析'hot_keywords':{},# 热门关键词'summary':{}# 总体统计}
total_items =0
all_titles =[]
all_keywords =[]
platform_item_counts ={}# 分析各平台数据for platform_key, platform_data in self.hot_data.items():
platform_name = self.platforms.get(platform_key, platform_key)
items = platform_data.get('data',[])
platform_item_counts[platform_name]=len(items)
total_items +=len(items)# 提取标题和关键词
platform_titles =[]for item in items:
title = item.get('title','')if title:
platform_titles.append(title)
all_titles.append(title)# 简单的关键词提取
keywords = self._extract_keywords(title)
all_keywords.extend(keywords)# 平台统计
analysis['platform_stats'][platform_name]={'total_items':len(items),'avg_title_length':sum(len(title)for title in platform_titles)/len(platform_titles)if platform_titles else0,'titles_sample': platform_titles[:5]# 前5个标题作为样本}# 标题分析if all_titles:
analysis['title_analysis']={'total_titles':len(all_titles),'avg_length':sum(len(title)for title in all_titles)/len(all_titles),'max_length':max(len(title)for title in all_titles),'min_length':min(len(title)for title in all_titles),'length_distribution': self._get_length_distribution(all_titles)}# 热门关键词分析if all_keywords:
keyword_counter = Counter(all_keywords)
analysis['hot_keywords']={'top_20': keyword_counter.most_common(20),'total_unique_keywords':len(keyword_counter)}# 总体统计
analysis['summary']={'total_hot_items': total_items,'successful_platforms':len(self.hot_data),'failed_platforms':len(self.platforms)-len(self.hot_data),'top_platforms_by_items':sorted(platform_item_counts.items(), key=lambda x: x[1], reverse=True)[:10]}
self.analysis_results = analysis
logger.info("热点内容分析完成")return analysis
def_extract_keywords(self, text:str)-> List[str]:"""简单的关键词提取
Args:
text (str): 文本内容
Returns:
List[str]: 提取的关键词列表
"""# 移除标点符号和数字
cleaned_text = re.sub(r'[^\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff\w]','', text)# 提取2-4字的中文词汇
keywords =[]for i inrange(len(cleaned_text)):for length in[2,3,4]:if i + length <=len(cleaned_text):
word = cleaned_text[i:i+length]iflen(word)== length and word.strip():
keywords.append(word)return keywords
def_get_length_distribution(self, titles: List[str])-> Dict:"""获取标题长度分布
Args:
titles (List[str]): 标题列表
Returns:
Dict: 长度分布统计
"""
length_ranges ={'0-10':0,'11-20':0,'21-30':0,'31-40':0,'41-50':0,'50+':0}for title in titles:
length =len(title)if length <=10:
length_ranges['0-10']+=1elif length <=20:
length_ranges['11-20']+=1elif length <=30:
length_ranges['21-30']+=1elif length <=40:
length_ranges['31-40']+=1elif length <=50:
length_ranges['41-50']+=1else:
length_ranges['50+']+=1return length_ranges
defgenerate_report(self)->str:"""生成分析报告
Returns:
str: 格式化的分析报告
"""ifnot self.analysis_results:return"请先执行数据分析"
report_lines =[]
report_lines.append("="*60)
report_lines.append(" 各大平台热点数据分析报告")
report_lines.append("="*60)
report_lines.append("")# 总体统计
summary = self.analysis_results['summary']
report_lines.append("
版权声明:本文标题:DailyHot API实战:打造个性化内容推荐系统的步骤 内容由网友自发贡献,该文观点仅代表作者本人,
转载请联系作者并注明出处:http://www.roclinux.cn/b/1772595471a3557130.html,
本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
更多相关文章
从192.168.1.1开始:Adobe Flash Player官方入口的全面解读
【登陆官网】网友提问:怎么用的呢?的时候,官网登陆不了怎么办?热心网友答:要进入192.1.1.1,需要手机连接路由器发射出来的Wi
系统优化新纪元:Dism++ x64 2025最新版,Windows精简与C盘瘦身的终极攻略
一、 为什么技术人都要用 Dism++? 在 Windows 运维和优化领域, Dism++被称为“全球第一款基于 CBS 的 Dism GUI 实现”。 对于普通用户,这可能听起来很拗口。简单
从0到1:Dism++教你快速完成系统安装,新手必备技能!
系统安装是一个简单而又复杂的活。有的仅仅为了安装系统,先把ESD转为ISO。 有的因为安装器不支持ESD,而转换为WIM。还有的在解压ISO……反正各种心烦 本文将通过一些实例,帮助大家驾驭Dism 。 目录
玩转Dism++,打造流畅的电脑体验
简介:Dism++是一款集成多种功能的Windows系统优化管理工具,提供从更新补丁管理到系统封装的一站式服务。它以高效、稳定和易用性获得了IT爱好者的广泛好评。本文将详细介绍Dism++的核心功能,包括系统更新补丁管理、垃圾清理、系
Windows系统维护新纪元:Dism命令的高效应用实践
Dism是什么? dism 命令(Deployment Image Servicing and Management)是Windows操作系统中的一个命令行工具,用于管理和维护映像文件(如Windows安装映像或修复映像)。d
一文解密Dism++:卸载驱动的超高效方法
资源说明 Dism++(系统精简利器)是一款功能全面的Windows系统精简工具,在某种程度上可以说是以前的Dism管理器的升级版(最开始的名字叫Windows更新清理工具),Dism++(系统精简利器)全新的构建,更小的体积
让Dism++帮您驾驭Windows系统,轻松优化
简介:Dism++是一款先进的系统维护工具,专注于清理电脑垃圾、释放内存,提供全面的系统优化解决方案。最新版本Dism++10.1.1000.100_2d2bf466baca088c4b35248f5a7316f4e00cac0b特别
0x800736cc让你头疼?用DISM让你的Windows更新畅通无阻
在server 2012系统上安装IIS时报了一个错误,错误代码为0x800736cc,查了一下官方社区发现这个问题是系统被一些优化工具优化时或者一些其他操作造成了系统文件损坏,造成系统不能安装更新(安装IIS也是一个系统安装更新的过
从入门到精通:Dism++带你玩转系统安装,新手也能玩得转!
系统安装是一个简单而又复杂的活。有的仅仅为了安装系统,先把ESD转为ISO。 有的因为安装器不支持ESD,而转换为WIM。还有的在解压ISO……反正各种心烦 本文将通过一些实例,帮助大家驾驭Dism 。 目录
一文读懂Dism命令行,Adobe Flash Player安装不再难!
相关文章推荐:Windows ADK 下载地址: 命令示例:Gimagex图形化演示:以下命令由DISMGUI生成,原汁原味1.首次备份镜像【Captu
系统维护必备工具:DISM++助你轻松应对Flash中心和Player
简介:DISM++是一款全方位的电脑维护软件,提供深度扫描和清理功能,专为优化个人计算机而设计。它能够高效清除各种系统垃圾和无用文件,释放硬盘空间,并通过系统清理、优化、备份和恢复功能提高电脑的运行速度和性能。该软件还支持多语言界面,
Windows Server系统备份与恢复:实战教程
1、添加windows server backup功能 a)选择添加角色和功能 b)选择功能中勾选“windows server backup”,然后“下一步” c)安装功能 2、使用windows s
C盘大搬家?别怕,Ghost备份带你安全过!
推荐用U盘制作启动工具 大白菜or老毛桃 备份:以老毛桃为例,进入PE,点击左下角开始,可见ghost功能选项 运行Ghost后,单击“OK”。 选择“Local”→“Partition”→“
一次学透Ghost系统备份与恢复,保护你的电脑安全!
Ghost是赛门铁克公司推出的一个用于系统、数据备份与恢复的工具。其最新版本是Ghost11。但是自从Ghost9之后,它就只能在windows下面运行,提供数据定时备份、自动恢复与系统备份恢复的功能。本文将要介绍的
Adobe Flash Player的未来发展趋势预测
目录背景: 在日常的工作中,由于我的笔记本自带的SSD固态硬盘是512G的容量,平时下几个大型的文件或者资料就要快满了,于是决定换一个1TB的固态硬盘,换之前首先确认自己现在用的是什么类型的固态硬盘,推荐大家一款
Linux备份与恢复必修课:SWF文件安全策略从入门到精通
在linux工作,系统备份是很有必要的,养成系统备份的好习惯会提高你的工作效率。下面我就简单的说一下:1.备份系统首先成为root用户:sudo su然后进入文件系统的根目录
Linux系统安全小贴士:掌握备份与恢复,安心每一天
系统备份linux秉承一切皆文件的思想,系统备份就相当于把整个(根目录)所有文件打包压缩保存。 备份前先切换到root用户,避免权限问题,然后切换到(根目录)。 tar -cvpzf mediaDisk
Linux系统不哭:高效备份与快速恢复方案
备份系统1.先切换到root用户sudosu 2.进入根目录tar cvpzf backup.tgz --exclude=proc --exclude=lost+found --exclude=ba
Win10系统备份轻松搞定:掌握captureimage命令的关键技巧
Win10自带的备份工具备份系统Windows操作系统经过从win98,win2000,winxp,win7,win8到win10的不断更新和完善,功能已经非常强大、完备了。但伴随着微软把重点转移到云端,对更新维护不再保
SWF文件备份失败?这些步骤让你轻松搞定
数据备份与恢复、系统备份与恢复 一、数据备份与恢复 1、什么是备份 备份,即另外准备一 – 为应付文件、数据丢失或损坏等可能出现的意外情况,将电子计算机存储设备中的数据复制到大容量存储设备中 2
发表评论