2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录

    • 写在前面
    • 步骤
      • 打开CSDN质量分页面
      • 粘贴查询文章url
      • 按F12打开调试工具,点击Network,点击清空按钮
      • 点击查询
      • 是调了这个接口`https://bizapi.csdn.net/trends/api/v1/get-article-score`
      • 用postman测试调用这个接口(不行,认证不通过)
      • 我查了一下,这种认证方式貌似是阿里云的API认证
      • 这里有一篇巨好的参考文章
      • 参考上面参考文章中的获取质量分java代码部分,用python代码实现获取博文质量分(可以成功查询)
      • 读取我们上一篇文章中的博客列表articles.json,逐个获取质量分,最后把结果保存到processed_articles.json★★★
      • 编写代码处理processed_articles.json,提取原创文章,根据url去重,并按质量分由小到大排序,生成original_sorted_articles.json★★★
      • 编写代码统计original_sorted_articles.json中原创文章数量,计算平均质量分★★★
      • 搞了个监控程序,如果我们更新了博客,就去original_sorted_articles.json把对应的score置零,然后程序马上感应到并重新获取质量分,重新计算平均质量分★★★

上一篇:1. 如何爬取自己的CSDN博客文章列表(获取列表)(博客列表)(手动+python代码方式)

写在前面

上一篇文章中,我们已经成功获取到了自己的CSDN已发布博文列表:

(articles.json)

在这里插入图片描述

本篇文章将实现获取每篇原创文章的质量分,并由小到大排序。

步骤

打开CSDN质量分页面

https://www.csdn.net/qc?utm_source=1966961068

粘贴查询文章url

在这里插入图片描述

按F12打开调试工具,点击Network,点击清空按钮

在这里插入图片描述

点击查询

在这里插入图片描述

是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

用postman测试调用这个接口(不行,认证不通过)

POST https://bizapi.csdn.net/trends/api/v1/get-article-score

{"url": "https: //dontla.blog.csdn.net/article/details/132227398"
}

在这里插入图片描述
提示:

{"message": "X-Ca-Key is not exist"
}

然后我把X-Ca-Key从浏览器复制下来,给它加到Headers参数里了:

在这里插入图片描述
然后它又提示什么:

{"message": "X-Ca-Signature not exist"
}

在这里插入图片描述

然后我故技重施,把那些提示缺少的东西统统从浏览器复制下来给它加上:

在这里插入图片描述

但是最后提示:

{"message": "HMAC signature does not match"
}

这有点尴尬啊。。。

我查了一下,这种认证方式貌似是阿里云的API认证

有亿点复杂,一时半会搞不懂

这里有一篇巨好的参考文章

如何批量查询自己的CSDN博客质量分

参考上面参考文章中的获取质量分java代码部分,用python代码实现获取博文质量分(可以成功查询)

就是这一段:

// //循环调用csdn接口查询所有的博客质量分
String urlScore = “https://bizapi.csdn.net/trends/api/v1/get-article-score”;
//
//请求头
HttpHeaders headers = new HttpHeaders();
headers.set(“accept”,“application/json, text/plain, /”);
headers.set(“x-ca-key”,“203930474”);
headers.set(“x-ca-nonce”,“22cd11a0-760a-45c1-8089-14e53123a852”);
headers.set(“x-ca-signature”,“RaEczPkQ22Ep/k9/AI737gCtn8qX67CV/uGdhQiPIdQ=”);
headers.set(“x-ca-signature-headers”,“x-ca-key,x-ca-nonce”);
headers.set(“x-ca-signed-content-type”,“multipart/form-data”);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
//调用接口获取数据
List scoreModels = new ArrayList<>();
for (String bkUrl : urlList) {
MultiValueMap<String,String> requestBody = new LinkedMultiValueMap<>();
requestBody.put(“url”, Collections.singletonList(bkUrl));
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody, headers);
URI uri = URI.create(urlScore);
ResponseEntity responseEntity = restTemplate.postForEntity(uri, requestEntity, String.class);
JSONObject data1 = JSON.parseObject(responseEntity.getBody(),JSONObject.class) ;
ScoreModel scoreModel = JSONObject.parseObject(data1.get(“data”).toString(),ScoreModel.class);
scoreModels.add(scoreModel);
System.out.println("名称: "+scoreModel.getTitle() +"分数: " + scoreModel.getScore() +"时间: " + scoreModel.getPost_time());
}
return scoreModels;
}

传入参数为urlList:

import requests
from requests.models import PreparedRequestdef get_score_models(url_list):url_score = "https://bizapi.csdn.net/trends/api/v1/get-article-score"headers = {"accept": "application/json, text/plain, */*","x-ca-key": "203930474","x-ca-nonce": "22cd11a0-760a-45c1-8089-14e53123a852","x-ca-signature": "RaEczPkQ22Ep/k9/AI737gCtn8qX67CV/uGdhQiPIdQ=","x-ca-signature-headers": "x-ca-key,x-ca-nonce","x-ca-signed-content-type": "multipart/form-data"}score_models = []for bk_url in url_list:data = {"url": [bk_url]}response = send_request(url_score, data, headers)data1 = response.json()print(data1)'''{'code': 200, 'message': 'success', 'data': {'article_id': '132240693', 'score': 95, 'message': '文章质量良好', 'post_time': '2023-08-12 17: 45: 24'}}        '''score_model = data1["data"]score_models.append(score_model)print(f'文章Id:{score_model["article_id"]}\n分数:{score_model["score"]}\n文章质量:{score_model["message"]}\n发布时间:{score_model["post_time"]}')return score_modelsdef send_request(url, data, headers):session = requests.Session()prepared_request = PreparedRequest()prepared_request.prepare(method='POST', url=url,headers=headers, data=data)return session.send(prepared_request)# 示例调用
urlList = ["https://dontla.blog.csdn.net/article/details/132240693"]
scoreModels = get_score_models(urlList)

上面的验证信息,我从那篇博客里搞来的,怎么生成的,我就搞不清楚了。。。

运行上面代码,能成功得到质量分信息:

在这里插入图片描述

读取我们上一篇文章中的博客列表articles.json,逐个获取质量分,最后把结果保存到processed_articles.json★★★

我们上一篇文章得到的articles.json是这样的:

在这里插入图片描述

下面代码将读取它并逐个获取质量分:

(getArticleScore.py)

import requests
from requests.models import PreparedRequest
import jsondef get_score_models(url):url_score = "https://bizapi.csdn.net/trends/api/v1/get-article-score"headers = {"accept": "application/json, text/plain, */*","x-ca-key": "203930474","x-ca-nonce": "22cd11a0-760a-45c1-8089-14e53123a852","x-ca-signature": "RaEczPkQ22Ep/k9/AI737gCtn8qX67CV/uGdhQiPIdQ=","x-ca-signature-headers": "x-ca-key,x-ca-nonce","x-ca-signed-content-type": "multipart/form-data"}data = {"url": url}response = send_request(url_score, data, headers)data1 = response.json()# print(data1)'''{'code': 200, 'message': 'success', 'data': {'article_id': '132240693', 'score': 95, 'message': '文章质量良好', 'post_time': '2023-08-12 17: 45: 24'}}        '''score_model = data1["data"]return score_modeldef send_request(url, data, headers):session = requests.Session()prepared_request = PreparedRequest()prepared_request.prepare(method='POST', url=url,headers=headers, data=data)return session.send(prepared_request)def process_article_json():# 读取articles.json文件with open('articles.json', 'r') as f:articles = json.load(f)# 遍历每个元素并处理for article in articles:score_model = get_score_models(article['article_url'])article['article_score'] = score_model['score']print(article)# 保存处理后的结果到新的JSON文件output_file = 'processed_articles.json'with open(output_file, 'w') as f:json.dump(articles, f, ensure_ascii=False, indent=4)if __name__ == '__main__':process_article_json()

在这里插入图片描述

最终得到processed_articles.json:

在这里插入图片描述
在这里插入图片描述

编写代码处理processed_articles.json,提取原创文章,根据url去重,并按质量分由小到大排序,生成original_sorted_articles.json★★★

(getOriginalSort.py)

import json# 读取JSON文件
with open('processed_articles.json', 'r') as f:data = json.load(f)# 过滤和排序数据,并去除重复的元素
filtered_data = []
seen_urls = set()
for article in data:if article['article_type'] == '原创' and article['article_url'] not in seen_urls:filtered_data.append(article)seen_urls.add(article['article_url'])sorted_data = sorted(filtered_data, key=lambda x: x['article_score'])# 保存到新的JSON文件
with open('original_sorted_articles.json', 'w') as f:json.dump(sorted_data, f, indent=4, ensure_ascii=False)

执行:

python3 getOriginalSort.py

生成文件original_sorted_articles.json

在这里插入图片描述

不看不知道,一看吓一跳啊,居然这么多一分的。。。心塞

在这里插入图片描述

编写代码统计original_sorted_articles.json中原创文章数量,计算平均质量分★★★

(getAverageScore.py)

import json# 读取 JSON 文件
with open('original_sorted_articles.json', 'r') as file:articles = json.load(file)# 统计 article_score 并计算平均值
total_score = 0
num_articles = len(articles)
for article in articles:total_score += article['article_score']
average_score = total_score / num_articles# 打印结果
print(f"元素数量:{num_articles}")
print(f"平均 article_score:{average_score}")# 保存结果到文本文件
with open('average_score_result.txt', 'w') as file:file.write(f"元素数量:{num_articles}\n")file.write(f"平均 article_score:{average_score}\n")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我去,这也太低了吧,客服咋给我算出60几分的,难道只统计最近一两年的?

唉,反正慢慢改吧。。。😔

搞了个监控程序,如果我们更新了博客,就去original_sorted_articles.json把对应的score置零,然后程序马上感应到并重新获取质量分,重新计算平均质量分★★★

在这里插入图片描述
(update_score.py)

import time
import json
import requests
from requests.models import PreparedRequestdef get_score_models(url):url_score = "https://bizapi.csdn.net/trends/api/v1/get-article-score"headers = {"accept": "application/json, text/plain, */*","x-ca-key": "203930474","x-ca-nonce": "22cd11a0-760a-45c1-8089-14e53123a852","x-ca-signature": "RaEczPkQ22Ep/k9/AI737gCtn8qX67CV/uGdhQiPIdQ=","x-ca-signature-headers": "x-ca-key,x-ca-nonce","x-ca-signed-content-type": "multipart/form-data"}data = {"url": url}response = send_request(url_score, data, headers)data1 = response.json()# print(data1)'''{'code': 200, 'message': 'success', 'data': {'article_id': '132240693', 'score': 95, 'message': '文章质量良好', 'post_time': '2023-08-12 17: 45: 24'}}        '''score_model = data1["data"]return score_modeldef send_request(url, data, headers):session = requests.Session()prepared_request = PreparedRequest()prepared_request.prepare(method='POST', url=url,headers=headers, data=data)return session.send(prepared_request)def getAverageScore(articles):# 统计 article_score 并计算平均值total_score = 0num_articles = len(articles)for article in articles:total_score += article['article_score']average_score = total_score / num_articles# 打印结果print(f"元素数量:{num_articles}")print(f"平均 article_score:{average_score}")def update_article_scores(file_path):while True:with open(file_path, 'r') as f:articles = json.load(f)for article in articles:if article['article_score'] == 0:print(f'监测到文章 {article["article_url"]} 改变,重新获取质量分')article['article_score'] = get_score_models(article['article_url'])['score']print(f'文章 {article["article_url"]} 新质量分为 {article["article_score"]}')# 排序# articles = sorted(articles, key=lambda x: x['article_score'])# 统计 article_score 并计算平均值getAverageScore(articles)with open(file_path, 'w') as f:json.dump(articles, f, indent=4, ensure_ascii=False,)print()time.sleep(1)  # 暂停1秒后再次遍历文件if __name__ == '__main__':# 在主程序中调用update_article_scores函数来更新article_scorefile_path = 'original_sorted_articles.json'update_article_scores(file_path)

(original_sorted_articles.json)
在这里插入图片描述

如果我们改了博客,把那篇的article_score置零:

在这里插入图片描述

这样实时计算就比较方便

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

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

相关文章

阿里云免费服务器领取入口_限制条件_申请指南

阿里云免费服务器领取&#xff0c;个人和企业用户均可以申请&#xff0c;个人免费服务器1核2GB 每月750小时&#xff0c;企业u1服务器2核8GB免费使用3个月&#xff0c;阿里云百科分享阿里云免费服务器申请入口、个人和企业免费配置、申请资格条件及云服务器免费使用时长&#x…

SpringBoot 简单入门部署

1. 环境要求 Java 8 (配置环境变量)Maven 3.3idea 2019.1.2 及以上 1.1 maven 配置 <mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/n…

display 属性有哪些值,分别表示什么意思

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ display 属性是什么&#xff1f;⭐ display 属性有哪些值&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

4. 软件开发的环境搭建

目录 1. 搭建环境 1.1 检查 JDK 1.2 检查 MySQL 数据库 1.3 检查 Maven 1.4 检查 GITEEGIT 1.5 安装插件 1.5.1 安装 Spring Boot Helper 1.5.2 安装 lombok 1.6 创建仓库 1.6.1 登录 GITEE 创建仓库并复制仓库地址 1.6.2 克隆到本地 1.7 创建工程 1.7.1 设置编码…

ubuntu下gif动态图片的制作

Gif图片比视频小, 比静态JPG图片形象生动, 更适用于产品展示和步骤演示等。各种各样的gif动图为大家交流提供很大的乐趣. 这里简单介绍ubuntu系统下gif图的制作。 一、工具安装: kazam和ffmpeg kazam是linux下的一款简单但是功能强大的屏幕录制工具. 它可录制声音并选择全屏录…

Benchmarking Augmentation Methods for Learning Robust Navigation Agents 论文阅读

论文信息 题目&#xff1a;Benchmarking Augmentation Methods for Learning Robust Navigation Agents: the Winning Entry of the 2021 iGibson Challenge 作者&#xff1a;Naoki Yokoyama, Qian Luo 来源&#xff1a;arXiv 时间&#xff1a;2022 Abstract 深度强化学习和…

redis设置database 不生效剖析

设置database 不生效剖析 前言配置加载类问题commons-pool 对象池 主页传送门&#xff1a;&#x1f4c0; 传送 前言 事情是这样的 今天在拉取了同事的代码做redis缓存设置的时候&#xff0c;发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库。这引起了我的好…

WebSocket与消息推送

B/S结构的软件项目中有时客户端需要实时的获得服务器消息&#xff0c;但默认HTTP协议只支持请求响应模式&#xff0c;这样做可以简化Web服务器&#xff0c;减少服务器的负担&#xff0c;加快响应速度&#xff0c;因为服务器不需要与客户端长时间建立一个通信链接&#xff0c;但…

Qt中将信号封装在一个继承类中的方法

QLabel标签类对应的信号如下&#xff1a; Qt中标签是没有双击&#xff08;double Click&#xff09;这个信号的&#xff1b; 需求一&#xff1a;若想双击标签使其能够改变标签中文字的内容&#xff0c;那么就需要自定义一个“双击”信号&#xff0c;并将其封装在QLabel类的派生…

Programming abstractions in C阅读笔记:p107-p110

《Programming Abstractions In C》学习第46天&#xff0c;p107-p110&#xff0c;3.1小节——“The concept of interface”&#xff0c;总结如下&#xff1a; 一、技术总结 1.client p108&#xff0c;调用library的program称为client。 2.interface p108&#xff0c;“To do …

马来西亚的区块链和NFT市场调研

马来西亚的区块链和NFT市场调研 基本介绍 参考&#xff1a; https://zh.wikipedia.org/wiki/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A zz制度&#xff1a;联邦议会制 语言文字&#xff1a; 马来语 民族&#xff1a; 69.4%原住民&#xff08;土著&#xff09;&#xff0c;23.2%…

GPT-NER:使用大型语言模型进行命名实体识别

讲在前面&#xff0c;chatgpt出来的时候就想过将其利用在信息抽取方面&#xff0c;后续也发现了不少基于这种大语言模型的信息抽取的论文&#xff0c;比如之前收集过的&#xff1a; https://github.com/cocacola-lab/GPT4IE https://github.com/RidongHan/Evaluation-of-ChatG…