CSDN热榜排名追踪工具上线,随时查看热榜链路数据

大家好,我是小小明。

今天大家期待已久的热榜追踪神器上线了,包含历史热榜搜索器和近两日热榜排名等。

历史热榜追踪数据搜索:http://120.78.229.124:8000/static/search.html

热榜涨粉榜top50:http://120.78.229.124:8000/rankfollow/

热榜追踪程序演示

下面我们分别来看看这两个网页:

历史热榜追踪数据搜索

打开网页后界面如下:

image-20211105205544739

该网页默认展示最近上榜的20条数据,我们可以通过搜索找到我们需要的数据。

例如我们想查看昵称中包含java的用户上榜情况,可以再昵称输入框输入java后回车:

image-20211105210043396

可以看到上榜时间,小时数,以及在热榜期间的涨粉量都一目了然。我们可以通过表格组件对查询结果进行二次排序:

image-20211105210413020

这就是按涨粉量排序后的结果。

当前目前我截图的数据热度链接比较长,我目前已经更新按照万为单位保留一位小数进行追加。

还可以搜索近20条标题包含python的上榜数据,多个条件也支持组合查询。

关于排名有一些搜索小技巧,这里的排名是根据排名链接进行搜索的,我们可以根据条件,1,搜索近期上过榜一的文章(不包含仅一上榜就到榜1的):

image-20211105211030698

注意:上榜时长为null表示该条数据当前还在热榜中。

我们还可以通过_搜索上过榜前9的数据:

image-20211105211317388

最后根据日期我们可以搜索指定日期上榜的数据,例如搜索11月4号上过榜前9的数据:

image-20211105211420582

热榜追踪热榜涨粉top50

在另一个页面http://120.78.229.124:8000/rankfollow/则显示今日热榜的涨粉top50:

image-20211105211629243

继续往下划还可以看到昨日热榜涨粉top50:

image-20211105211733710

然后可以看到历史热榜涨粉top50:

image-20211105211820354

目前历史涨粉榜情况不佳是因为数据库重建后,采集程序昨天下午2点才重新启动。再过一星期,相信大家都能看到一个完全不一样的历史涨粉热榜。

最下面还有一个模块近10天上榜次数与涨粉量top50

image-20211105212043504

不过从昨天下午两点到现在还没有人能连续两次上榜,相信过两天后,我们能够看到上榜次数超过2次的用户出现。

热榜追踪程序的开发思路

采集程序开发

相信很多小伙伴更好奇该程序如何开发,那么下面我简单介绍一下该程序的开发思路与代码。

思路:有一个采集程序每小时执行一次,每次执行都获取当前热榜和历史热榜进行差异比较,划分为三类:

  • 同时存在当前热榜和历史热榜中,说明是正在热榜的数据
  • 不在当前热榜均在历史热榜中,说明是已下榜的数据
  • 在当前热榜不在历史热榜中,说明是新上榜的数据

对于这三类数据,有不同的处理策略:

  • 对正在热榜的数据追加更新排名链路和热度链路
  • 对已下榜的数据,根据链接逐条采集当前粉丝数,填入下榜粉丝数字段中;同时根据当前时间更新下榜时间。
  • 对于新上榜的数据,根据当前时间填入上榜时间,采集当前粉丝数填入上榜粉丝数字段中。

对于新上榜的每条数据,使用文章ID作为主键进行存储。

下面是以上思路的完整代码:

from sqlalchemy import create_engine
import pandas as pd
from datetime import datetimefrom check_func import pares_url
from database import databasesuri = f'mysql+pymysql://{databases["USER"]}:{databases["PASSWORD"]}@{databases["HOST"]}:{databases["PORT"]}/{databases["NAME"]}'
engine = create_engine(uri)# 更新当前热榜链条
sql = """UPDATE hot_rank_circle a,(SELECTdistinct n.id,CONCAT(h.`排名链路`,',',n.`排名`) 排名链路,CONCAT(h.`热度链路`,',',ROUND(n.热度/10000,1)) 热度链路
FROM hot_rank n JOIN hot_rank_circle h ON n.id=h.id
WHERE SUBSTRING_INDEX(h.热度链路,',',-1)!=n.热度) b 
SET a.排名链路=b.排名链路,a.热度链路=b.热度链路 WHERE a.id=b.id;"""
engine.execute(sql)# 更新下榜时的粉丝数
sql = """SELECT id,链接 FROM hot_rank_circle
WHERE id NOT IN (SELECT DISTINCT id FROM hot_rank)
AND 下榜时间 IS NULL;"""
id2url = pd.read_sql(sql, engine)
if id2url.shape[0] != 0:fan_nums = []for url in id2url.链接.values:data = pares_url(url)# print(url, data)fan_nums.append(data.get('粉丝'))id2url['链接'] = fan_numsid2url.to_sql(name="tmp", con=engine, if_exists="replace", index=False)sql = "UPDATE hot_rank_circle, tmp SET hot_rank_circle.下榜粉丝数=tmp.链接 WHERE hot_rank_circle.id=tmp.id;"engine.execute(sql)# 更新下榜时间
sql = """UPDATE hot_rank_circle SET 下榜时间=NOW()
WHERE id NOT IN (SELECT distinct id FROM hot_rank)
AND 下榜时间 IS NULL;"""
engine.execute(sql)# 增加新上榜数据
sql = """SELECT distinct n.昵称, n.标题, n.链接, n.排名 排名链路, ROUND(n.热度/10000,1) 热度链路
FROM hot_rank n
LEFT JOIN hot_rank_circle h
ON n.id=h.`id`
WHERE h.id IS NULL;"""
hot_rank = pd.read_sql(sql, engine)
idx = hot_rank.链接.apply(lambda s: s[s.rfind("/") + 1:]).astype("int")
hot_rank.insert(0, "id", idx)
# hot_rank.热度链路 = (hot_rank.热度链路 / 10000).round(1)
# date = str(datetime.now())[5:13]
hot_rank["上榜时间"] = datetime.now()
hot_rank["下榜时间"] = None
fan_nums = []
for url in hot_rank.链接.values:data = pares_url(url)# print(url, data)fan_nums.append(data.get('粉丝'))
hot_rank['上榜粉丝数'] = fan_nums
hot_rank['下榜粉丝数'] = None
hot_rank.to_sql(name="hot_rank_circle", con=engine, if_exists="append", index=False)

数据查询页开发

restful接口开发:

def rank_follow_search(request):if request.method == "POST":return HttpResponse("不支持的请求类型")args = []name = request.GET.get("name", "").replace("'", "").replace('"', "").replace(";", "")if name:args.append(f"昵称 LIKE '%%{name}%%'")title = request.GET.get("title", "").replace("'", "").replace('"', "").replace(";", "")if title:args.append(f"标题 LIKE '%%{title}%%'")rank = request.GET.get("rank", "").replace("'", "").replace('"', "").replace(";", "")if rank:args.append(f"排名链路 LIKE '%%{rank}%%'")date = request.GET.get("date", "").replace("'", "").replace('"', "").replace(";", "")if date:args.append(f"上榜时间 LIKE '%%{date}%%'")args = " AND ".join(args)if not args:args = "1=1"# print(args)sql = f"""SELECT 昵称,标题,链接,排名链路,热度链路,SUBSTRING(上榜时间,6,8) 上榜时间,(TO_DAYS(下榜时间)-TO_DAYS(上榜时间))*24+HOUR(下榜时间)-HOUR(上榜时间) 上榜时长,上榜粉丝数,下榜粉丝数-上榜粉丝数 涨粉量 FROM hot_rank_circleWHERE {args}ORDER BY 上榜时间 DESC,上榜粉丝数 DESC LIMIT 20;"""try:df = pd.read_sql(sql, engine)df.fillna("null", inplace=True)return JsonResponse(df.to_dict(orient="records"), safe=False)except Exception as e:return JsonResponse({'status': -1, 'msg': str(e)})

虽然本程序完全无所谓SQL注入,但是防SQL注入还是得养成习惯,这里我就简单粗暴的采用了去掉查询条件中引号和分号来达到防SQL注入的目的。当然这种方法也可能一些特殊的方案防不住,期待大佬们能够指出。

前端展示页开发:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>热榜追踪数据搜索</title><link href="/static/css/bootstrap.min.css" rel="stylesheet"><link rel="stylesheet" type="text/css" href="/static/css/demo.css"><link rel="stylesheet" href="/static/dist/excel-bootstrap-table-filter-style.css"/><script type="text/javascript" src="/static/js/jquery-1.11.0.min.js"></script><script src="/static/js/vue.min.js"></script><script type="text/javascript" src="/static/dist/excel-bootstrap-table-filter-bundle.js"></script>
</head>
<body><div class="container"><div class="row"><div class="col-md-12"><h4>作者主页:<a href='https://xxmdmst.blog.csdn.net/' target="_blank">@小小明-代码实体</a></h4><h2>历史热榜追踪数据搜索</h2><h4>(最大只显示最近上榜的前20条数据,可以通过下面链接查看当前热榜)</h4><h4>数据来源:<a href="/hotrank/all/" target="_blank">全站综合热榜(含热榜标题词云)</a></h4><h4>今日热榜追踪:<a href="/rankfollow/" target="_blank">今日热榜追踪</a></h4><div id="in"><p>昵称:<input id="name">标题:<input id="title"></p><p>排名:<input id="rank">时间:<input id="date"></p></div><p><button id="run">搜索</button></p></div></div><table id="table1" class="table table-bordered table-intel"><thead><tr><th class="no-filter">昵称</th><th class="no-sort no-filter">标题</th><th class="no-sort no-filter">排名链路</th><th class="no-sort no-filter">热度链路</th><th class="no-filter">上榜时间</th><th class="no-filter">上榜时长</th><th class="no-filter">上榜粉丝数</th><th class="no-filter">涨粉量</th></tr></thead><tbody><tr v-for="row in rows"><td>{{ row.昵称 }}</td><td><a href='{{ row.链接 }}' target="_blank">{{ row.标题 }}</a></td><td>{{ row.排名链路 }}</td><td>{{ row.热度链路 }}</td><td>{{ row.上榜时间 }}</td><td>{{ row.上榜时长 }}</td><td>{{ row.上榜粉丝数 }}</td><td>{{ row.涨粉量 }}</td></tr></tbody></table>
</div><script type="text/javascript">$(function () {$('#table1').excelTableFilter({'captions': {a_to_z: '升序排列', z_to_a: '降序排列', search: '搜索', select_all: '全部选择'}});});$(function () {var vm = new Vue({el: '#table1',data: {rows: []}});window.vm = vm;$.get("/api/rank_follow_search/", function (data) {vm.rows = data;});});let func = function () {let name = $('#name').val();let title = $('#title').val();let rank = $('#rank').val();let date = $('#date').val();var url = `/api/rank_follow_search/?name=${name}&title=${title}&rank=${rank}&date=${date}`;console.log(url)$.get(url, function (data) {vm.rows = data;});};$("#in").keypress(function (even) {if (even.which == 13) {func()}});$('#run').click(func);
</script>
</body>
</html>

这里我使用了vue进行数据绑定,这样就可以大幅度简化代码,原本几十行JavaScript代码才是实现的动态数据修改变成了vm.rows = data;这一行。而且HTML部分的代码也变得和后端模板渲染的代码类似,非常方便。

排名页面开发

排名页面的写法比较简单粗暴,直接模板渲染。后端视图代码:

def rank_follow(request):context = {}context["date"] = str(date.today())# 今日涨粉top50sql = """SELECT 昵称,LEFT(标题,40) `标题(最大展示前40字)`,链接,排名链路,热度链路,SUBSTRING(上榜时间,6,8) 上榜时间,(TO_DAYS(下榜时间)-TO_DAYS(上榜时间))*24+HOUR(下榜时间)-HOUR(上榜时间) 上榜时长,上榜粉丝数,下榜粉丝数-上榜粉丝数 涨粉量 FROM hot_rank_circleWHERE TO_DAYS(上榜时间)=TO_DAYS(CURDATE()) AND 下榜时间 IS NOT NULLORDER BY 涨粉量 DESCLIMIT 50;"""df = pd.read_sql(sql, engine)context["today"] = df.values.tolist()# 昨日涨粉top50...# 历史涨粉榜top50...# 近7天上榜次数与涨粉量top50(过滤掉上榜时间低于2小时的数据)sql = """SELECT 昵称,COUNT(标题) `上榜次数`,GROUP_CONCAT(SUBSTRING(上榜时间,6,8)) 上榜时间汇总,GROUP_CONCAT((TO_DAYS(下榜时间)-TO_DAYS(上榜时间))*24+HOUR(下榜时间)-HOUR(上榜时间)) 上榜小时数汇总,MAX(下榜粉丝数)-MIN(上榜粉丝数) 涨粉量FROM hot_rank_circleWHERE (TO_DAYS(下榜时间)-TO_DAYS(上榜时间))*24+HOUR(下榜时间)-HOUR(上榜时间)>2AND TO_DAYS(上榜时间)>=TO_DAYS(DATE_SUB(CURDATE(), INTERVAL 9 DAY)) AND 下榜时间 IS NOT NULLGROUP BY 昵称HAVING COUNT(标题)>1ORDER BY 上榜次数 DESC,涨粉量 DESCLIMIT 50;"""df = pd.read_sql(sql, engine)context["recent"] = df.values.tolist()return render(request, 'rank_follow.html', context)

四个SQL获取了四个部分的数据,然后模块渲染代码大致都是如下格式:

<table id="table1" class="table table-bordered table-intel"><thead><tr><th class="no-filter">昵称</th><th class="no-sort no-filter">标题(最大展示前40)</th><th class="no-sort no-filter">排名链路</th><th class="no-sort no-filter">热度链路</th><th class="no-filter">上榜时间</th><th class="no-filter">上榜时长</th><th class="no-filter">上榜粉丝数</th><th class="no-filter">涨粉量</th></tr></thead><tbody>{% for obj in today %}<tr><td>{{ obj.0 }}</td><td><a href='{{ obj.2 }}' target="_blank">{{ obj.1 }}</a></td><td>{{ obj.3 }}</td><td>{{ obj.4 }}</td><td>{{ obj.5 }}</td><td>{{ obj.6 }}</td><td>{{ obj.7 }}</td><td>{{ obj.8 }}</td></tr>{% endfor %}</tbody>
</table>

这就是上面程序的完整开发思路和代码。

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

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

相关文章

小红书推广营销,排名机制流出!

小红书现在非常火爆&#xff0c;各大美妆、快消品商家和品牌都在抢占先机做小红书的推广营销&#xff0c;争抢红书的第一波流量。 但很多朋友会很苦恼自己做的为什么都没效果? 发布的笔记从来不会上推荐&#xff0c;甚至连一些浏览量都上不去&#xff01; 更别提最后的转化…

百度笔记聚合优化排名:如何写出小红书爆款文案

5000字长文警告&#xff1a;如果你的小红书收入&#xff0c;每月能上万&#xff0c;这篇回答可以不用看了! 达不到的&#xff0c;送你一份服装小红书引流变现模板&#xff1a;6种爆款标题&#xff0c;3大种草笔记模板&#xff0c;7种封面排版形式&#xff0c;8大问题答疑.....…

85%的跨境电商公司都在用的实时聊天,客户怎么看?

关键词&#xff1a;独立站运营、用户运营、聊天机器人 2022年85% 的公司都在使用实时聊天&#xff0c;在网站上利用实时聊天工具可以提供更强大的客户体验&#xff0c;最大限度地提高客户支持代理的效率&#xff0c;并在收入和客户保留方面获得更大收益。 一直在说企业用实时聊…

推荐五款你从未见过的嵌入式电子电路仿真APP

摘要&#xff1a;在这个人人一部甚至多部智能手机的年代&#xff0c;各种APP充斥在各种应用市场作为一名电子爱好者或者电子工程师&#xff0c;你在为如何选择APP而头痛吗&#xff1f;哪些你正在使用的APP使你在工作、生活、学习中如虎添翼呢&#xff1f;现在&#xff0c;小师弟…

模拟电子技术设计--简易函数信号发生器的设计与制作

题目&#xff1a;简易函数信号发生器的设计与制作 1 整机设计 1.1 设计任务及要求 结合所学的模拟电子技术知识&#xff0c;运用 AD 画图软件&#xff0c;设计并制作完成一简易函数信号发生器&#xff0c;要求能产生方波和三角波信号&#xff0c;且频率可调&#xff0c;并自行…

电子电路设计方法

2006-07-03 21:13:27 1 电子电路设计方法 图1-1 电子电路设计一般步骤 图1-2 脉搏计方案Ⅰ 如图1-3 脉搏计方案Ⅱ 图1-4 放大整形方案电路框图 图1-5 传感器原理电路 图1-6 同相放大器 图1-7 二阶有源滤波器 图1-8 施密特整形电路和电平转换电路 图1-9 放大与整形部分电路 图…

电源电子电路设计图TOP11经典分析 - 全文

一、稳压电源 1、3&#xff5e;25V电压可调稳压电路图 此稳压电源可调范围在3.5V&#xff5e;25V之间任意调节&#xff0c;输出电流大&#xff0c;并采用可调稳压管式电路&#xff0c;从而得到满意平稳的输出电压。 工作原理&#xff1a;经整流滤波后直流电压由R1提供给调整管的…

原理图-电源电路设计

电源电路是指提供给用电设备电力供应的电源部分的电路设计&#xff0c;使用的电路形式和特点。既有交流电源也有直流电源 电源电路一般可分为开关电源电路&#xff0c;稳压电源电路&#xff0c;稳流电源电路&#xff0c;功率电源电路&#xff0c;逆变电源电路&#xff0c;DC-D…

【硬件设计】开关电路

文章目录 1. 简介1.1 继电器概述1.2 光耦概述1.3 开关电路概述1.3.1 继电器开关电路概述1.3.2 光耦开关电路概述1.3.3 继电器和光耦开关电路概述1.3.4 三者比较 2. 继电器SDR-C5VDC-SL-A2.1 继电器SDR-C5VDC-SL-A特性2.2 继电器SDR-C5VDC-SL-A接线图及原理2.3 继电器SDR-C5VDC-…

【电路设计】Bandgap Voltage Curreat Reference

一、基本概念 The current or the voltage that is impedence with temperature and supply voltage, and also insensitivity with the fabrication process, is called as udge or current reference, usually knoun as PVT stablity 。 带隙基准直接来源于硅的能带隙,因此它…

手绘图说电子元器件-集成电路

集成电路是高度集成化的电子器件&#xff0c;具有集成度高、功能完整、可靠性好、体积小、重量轻、功耗低的特点&#xff0c;已成为现代电子技术中不可或缺的核心器件。 集成电路可分为模拟集成电路和数字集成电路两大类&#xff0c;包括集成运放、时基集成电路、集成稳压器、…

电子线路设计技巧6:Boost电路的参数设计

本文以实例方式介绍Boost电路的参数设计方法。项目需求&#xff1a;12V升压至50V&#xff0c;功率35W。 先看示例电路图&#xff0c;如下图所示。 在进行具体的参数计算之前&#xff0c;我们先简要的分析一下Boost电路的工作原理。 1、我们假设&#xff0c;C3和C4的容值相对于…

模拟IC设计——简单放大器的交流小信号仿真

仿真工具&#xff1a;Cadence virtuoso6.17 仿真工艺&#xff1a;simc18mmrf 仿真实例&#xff1a;简单放大器交流小信号分析 一、交流小信号分析 上一节: MOS管IV特性仿真 “simc18mmrf”中调用NMOS n33&#xff0c;按键盘中的Q键&#xff0c;在属性lu/5u;重复上述操作&…

交流信号采集电路设计(超详细分析)

交流信号采集电路设计&#xff08;超详细分析&#xff09; 背景&#xff1a;我当时也有疑问&#xff0c;单片机ADC不是只能采集直流信号么&#xff0c;那么有哪些办法可以转换后给单片机。现在弄懂了些皮毛&#xff0c;和大家分享。 一、交流变压取样 对于AC220V&#xff0c;…

基于stc89c52电子钟综合设计

1、基本功能&#xff1a; 实现时间自动显示和音响报时 ① 按实时时间显示时分秒 ② 每隔60秒自动短响一声 ③ 按日期显示年-月日 ④ 每隔60分连续响多声&#xff0c;几点响几声 ⑤ 可设置每天4次闹钟功能 ⑥ 设有调整日期、时间和止闹按钮 ⑦ 有…

模电课程设计——信号发生器

1.1 设计题目及要求 设计一个供电电源为交流220V、50Hz的占空比可调的矩形波、三角波信号发生器。主要电路指标要求波形频率为1KHz~10KHz&#xff0c;波形幅值小于12V&#xff0c;其它指标要求尽可能多的信号多样性。本设计是设计一个完整的信号发生器&#xff0c;单元电路必须…

AD8232芯片电路Auto Designer设计与构建

一、实验目的 1、加深对于普通仪表放大器的理解&#xff0c;同时也由此延伸到其它的放大器的理解&#xff1b; 2、学习、锻炼对于电子设计软件Altium Designer的运用——包含一个芯片的原理图、PCB设计、封装的添加&#xff0c;及整体电路板的原理图、PCB设计&#xff1b; 3、…

电子线路设计技巧4:ATT7022E电流采样电路

本篇日志介绍ATT7022E电流采样电路&#xff0c;ATT7022E电压采样电路都是通过电流互感器完成&#xff0c;可以分为2种&#xff1a;差分输入和单端输入。在条件允许的情况下&#xff0c;我们尽量采用差分输入方式构建电流采样电路&#xff0c;因为这样可以得到更高的精度和抗干扰…

(保姆级教学)ADS设计高频微波整流电路之二——版图联合仿真

目录 元件复制 版图生成 版图修正 EM设置 联合仿真 过孔保留 对于已经完成原理图仿真的微波电路而言&#xff0c;一块能够展现实际微带线形状的版图&#xff08;Layout&#xff09;能帮助我们进行实物图的设计与理解。 元件复制 由于在整流电路中&#xff0c;版图文件仅…