本篇文章尽量不使用的晦涩复杂的技术手段,仅仅利用简单的前端知识和相关api,配合浏览器获得我们想要的数据,进行分析
希望本篇文章可以让技术大佬会心一笑,回想自己当年是否也会有类似的的“奇葩”研究呢吧
也许这篇文章会勾起你当初从事技术工作时最纯粹的初衷
CSDN是我大学时接触的第一个技术社区,最近它增加了排行榜板块,里面细分了十几个分类,从互动、点赞、评论、收藏、时间纬度计算得到每篇文章的热度,将他们投放到对应的分类,最终汇聚成分类榜单和综合榜单。
社区在大力的鼓励大家进行技术分享和沉淀,以推动整个技术圈的发展。本篇文章也是因为我在浏览排行榜时的一个念头而诞生的,那就是我想从用户的视角:
用互联网黑话应该是这样的:
下面的代码都可以直接运行在浏览器控制台中,且我们尽量从用户的操作出发,避免给整个实现增加难度。
思路:
代码:
// 选中单条内容
const hotRankItem = document.querySelector('.hostitem');
// 获取标题
hotRankItem.querySelector('a.title').innerText;
// 获取作者
hotRankItem.querySelector('a.name').innerText;
// 获取热度
hotRankItem.querySelector('span.num').innerText;
结果:
思路:
代码:
function getData() {
const likeArray = (arr) => Array.prototype.slice.call(arr)
// 获取列表数组
const hotRankList = likeArray(document.querySelectorAll('.hostitem'));
// 处理榜单内所有数据
const newHotRankList = hotRankList.map((element, index) => {
const title = element.querySelector('a.title').innerText;
const name = element.querySelector('a.name').innerText;
const hot = element.querySelector('span.num').innerText;
return {
title, name, hot}
})
return newHotRankList;
}
getData()
结果:
注意
经常浏览排行榜的小伙伴可能意识到了,出于性能和体验的考虑,只有用户划到页面底部,才会更新排行榜单后续的内容,每次新增25条。所以我们也像一个真正的用户一样,让代码帮我们做实现浏览阅读行为好啦~
思路:
window.scrollTo(x, y)
可把内容滚动到指定的坐标。代码:
function getData() {
const likeArray = (arr) => Array.prototype.slice.call(arr)
// 获取列表数组
const hotRankList = likeArray(document.querySelectorAll('.hostitem'));
// 处理榜单内所有数据
const newHotRankList = hotRankList.map((element, index) => {
const title = element.querySelector('a.title').innerText;
const name = element.querySelector('a.name').innerText;
const hot = element.querySelector('span.num').innerText;
return {
title, name, hot}
})
return newHotRankList;
}
function getComData(){
let mainHeight = 0; // 内容高度
let timer = setInterval(() => {
let height = document.querySelector('.main').offsetHeight
if (mainHeight === height) {
const res = getData();
console.log(res)
clearInterval(timer);
} else {
mainHeight = height
window.scrollTo({
top: 100000,
behavior: "smooth"
})
}
}, 1000)
}
getComData();
结果:
之后的所有示例,默认先执行本小节的代码
同样,如果我是用户且我想看过所有的榜单,我的操作应该是这样的
思路:
const likeArray = (arr) => Array.prototype.slice.call(arr)
function getData() {
// 获取列表数组
const hotRankList = likeArray(document.querySelectorAll('.hostitem'));
const curBlogRankName = document.querySelector('.blog-rank-right-top li.active').innerText;
console.log(`正在拉去${
curBlogRankName}榜单数据`)
// 处理榜单内所有数据
const newHotRankList = hotRankList.map((element, index) => {
const title = element.querySelector('a.title').innerText;
const name = element.querySelector('a.name').innerText;
const hot = element.querySelector('span.num').innerText;
return {
title, name, hot, curBlogRankName}
})
return newHotRankList
}
function getComData(){
let mainHeight = 0; // 内容高度
return new Promise((resolve, reject)=>{
let timer = setInterval(() => {
let height = document.querySelector('.main').offsetHeight
if (mainHeight === height) {
const res = getData();
resolve(res);
clearInterval(timer);
} else {
mainHeight = height;
window.scrollTo({
top: 100000,
behavior: "smooth"
})
}
}, 1000)
})
}
// 获取列表榜单
async function loopNav(curList) {
const result = {
}
let i = 0;
const navList = likeArray(document.querySelectorAll('.blog-rank-right-top ul li'));
for(let i = 0; i < navList.length; i++){
navList[i].click();
const res = await getComData();
result[navList[i].innerText] = res;
}
console.log('榜单结果汇总:', result)
window.rankResult = result; // 将结果挂到window对象上
}
loopNav();
结果:
如果大家想要获取某个榜单内容:
例如:在CSDN全站综合热榜页面,打开控制台,执行2.3小节的代码
就可以的得到数组类型的数据。
我们拿到的数据应该下面这样的,按照第一章的思路,还要对其进行处理。
集合:{
榜单1:[
{
文章1}, {
文章1},
],
榜单1:[
{
文章1}, {
文章1},
]
}
有人可能会问,会什么不直接看综合热榜,这是因为单榜和热榜更新时间不同,其实任选其一往深研究即可。
思路:
代码:
window.rankResult100 = Object.keys(rankResult)
.reduce((prev, next) => prev.concat(rankResult[next]), [])
.sort((a, b) => b.hot - a.hot)
.slice(0, 100)
console.log('热度前100名(每日更新):', window.rankResult100)
结果:
emmm 可以看到,此时排在第一的是运维榜单-<程序猿是小贺>大佬的文章。
实现此需求的方式有很多,不要纠结方式~
代码:
window.rankResult100 = Object.keys(rankResult)
.reduce((prev, next) => prev.concat(rankResult[next]), [])
.sort((a, b) => b.hot - a.hot)
.slice(0, 100)
console.log('热度前100名(每日更新):', window.rankResult100)
// 统计榜单进去前100的数量
window.rankResultGroup = {
};
// 获取榜单名称并生成Key
const navList = Array.prototype.slice.call(document.querySelectorAll('.blog-rank-right-top li'))
.map(item => item.innerText)
.forEach(item => window.rankResultGroup[item] = 0)
// 统计数量
window.rankResult100.forEach(item => window.rankResultGroup[item.curBlogRankName]++);
console.log('各榜单拥有前100数量:', window.rankResultGroup);
结果:
怎么看,都像一句废话
使用的人多:
虽然我不是专业做数据分析的,但在知乎随便翻了一下编程语言热度排行,在TIOBE 公布的 2020年9月的编程语言排行榜
,可以看到前三名是 C、Java 和 Python,如图:
对比我们最后得到的结果:
嗯~相差不大。
截止到此时,我们完成了:
而这也让我对 click
、dom操作
、数组操作
等加深了印象,希望读到这里的同学也能有所收获,当然上面的代码一定有可以改进的地方的地方,欢迎各位大佬留言互动哦~
之后还能怎么做?我期待大家也能参与进来,和我和或其他人进行自己领域内的互动,例如:
也许一条隐密的捷径就在你感兴趣、你正在探索的事情中,加油!
本篇文章是技术与生活结合一篇文章,我将它定义为something interesting,也会同步在《余光的前端进阶笔记》中
读到这里的同学不妨做件小事,给我的GitHub仓库点个star吧!Thanks♪(・ω・)ノ
关于我
其他沉淀