当前位置: 首页 > news >正文

Python功能制作之获取CSDN所有发布文章的对应数据

大家好,今天我要分享的是一个实用的Python脚本,它可以帮助你批量获取CSDN博客上所有发布文章的相关数据,并将这些数据保存到Excel文件中。此外,脚本还会为每篇文章获取一个质量分,并将这个分数也记录在Excel中。让我们开始吧!

脚本功能概述

这个脚本主要分为两个部分:

  1. 获取文章信息并保存到Excel:这部分会从CSDN API获取你的文章列表,并将关键信息保存到Excel文件中。
  2. 获取文章质量分并更新Excel:这部分会为每篇文章请求一个质量分,并将这个分数添加到对应的Excel文件中。

实现步骤

1. 导入必要的库

首先,我们需要导入一些Python库来帮助我们完成这个任务:

import json
import pandas as pd
from openpyxl import Workbook, load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import math
import requests

2. 定义获取文章信息并保存到Excel的类

我们定义了一个类 GetInformationToExcel 来处理文章信息的获取和Excel文件的保存:

class GetInformationToExcel:def __init__(self, username, cookies, Referer, page, size, filename):self.username = usernameself.cookies = cookiesself.Referer = Refererself.size = sizeself.filename = filenameself.page = page# 发送HTTP GET请求到CSDN的API,获取文章列表def get_articles(self):url = "https://blog.csdn.net/community/home-api/v1/get-business-list"params = {"page": {self.page},"size": {self.size},"businessType": "blog","username": {self.username}}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Cookie': self.cookies,'Referer': self.Referer}try:response = requests.get(url, params=params, headers=headers)response.raise_for_status()data = response.json()return data.get('data', {}).get('list', [])except requests.exceptions.HTTPError as e:print(f"HTTP错误: {e.response.status_code} {e.response.reason}")except requests.exceptions.RequestException as e:print(f"请求异常: {e}")except json.JSONDecodeError:print("解析JSON失败")return []# 将文章列表转换为Pandas DataFrame,选择并重命名必要的列。def export_to_excel(self):df = pd.DataFrame(self.get_articles())df = df[['title', 'url', 'postTime', 'viewCount', 'collectCount', 'diggCount', 'commentCount']]df.columns = ['文章标题', 'URL', '发布时间', '阅读量', '收藏量', '点赞量', '评论量']wb = Workbook()sheet = wb.activefor r in dataframe_to_rows(df, index=False, header=True):sheet.append(r)for column in sheet.columns:max_length = 0column = [cell for cell in column]for cell in column:try:if len(str(cell.value)) > max_length:max_length = len(cell.value)except:passadjusted_width = (max_length + 5)sheet.column_dimensions[column[0].column_letter].width = adjusted_width# Save the workbookwb.save(self.filename)

在这个类中,我们实现了以下方法:

  • __init__:初始化方法,设置类的基本属性。
  • get_articles:发送HTTP GET请求到CSDN的API,获取文章列表。
  • export_to_excel:将文章列表转换为Pandas DataFrame,并保存到Excel文件。

3. 定义获取文章质量分的类

接下来,我们定义了另一个类 GetArticleScores 来处理文章质量分的获取和Excel文件的更新:

class GetArticleScores:def __init__(self, filepath):self.filepath = filepath# 发送HTTP POST请求到一个API,获取文章的质量分。@staticmethoddef get_article_score(article_url):url = "https://bizapi.csdn.net/trends/api/v1/get-article-score"headers = {"Accept": "application/json, text/plain, */*","X-Ca-Key": "203930474","X-Ca-Nonce": "b35e1821-05c2-458d-adae-3b720bb15fdf","X-Ca-Signature": "gjeSiKTRCh8aDv0UwThIVRITc/JtGJkgkZoLVeA6sWo=","X-Ca-Signature-Headers": "x-ca-key,x-ca-nonce","X-Ca-Signed-Content-Type": "multipart/form-data",}data = {"url": article_url}try:response = requests.post(url, headers=headers, data=data)response.raise_for_status()  # This will raise an error for bad responsesreturn response.json().get('data', {}).get('score', 'Score not found')except requests.RequestException as e:print(f"Request failed: {e}")return "Error fetching score"def get_scores_from_excel(self):"""读取Excel文件,获取文章URL列表。对每个URL调用 get_article_score 方法,获取分数列表。返回分数列表。"""df = pd.read_excel(self.filepath)urls = df['URL'].tolist()scores = [self.get_article_score(url) for url in urls]return scoresdef write_scores_to_excel(self):"""读取Excel文件到DataFrame。将获取的分数添加到DataFrame中。将更新后的DataFrame保存回Excel文件。"""df = pd.read_excel(self.filepath)df['质量分'] = self.get_scores_from_excel()df.to_excel(self.filepath, index=False)

在这个类中,我们实现了以下方法:

  • __init__:初始化方法,设置类的基本属性。
  • get_article_score:静态方法,发送HTTP POST请求到一个API,获取文章的质量分。
  • get_scores_from_excel:读取Excel文件,获取文章URL列表,并获取分数列表。
  • write_scores_to_excel:读取Excel文件到DataFrame,将获取的分数添加到DataFrame中,并保存回Excel文件。

4. 主程序

最后,我们在主程序中设置了文章总数、cookies、Referer和CSDN用户ID,并执行了以下步骤:

  • 计算需要请求的页数。
  • 循环处理每一页的文章,创建Excel文件,并获取质量分写入Excel。
if __name__ == '__main__':# 请填写:已发文章总数量,cookies,你的首页Referer,你的id:CSDNidtotal = 145cookies = 'uuid_tt_dd=10'  # Simplified for brevityReferer = 'https://blog.csdn.net/q244645787'CSDNid = 'q244645787'# 下面是计算和获取t_index = math.ceil(total / 100) + 1  # 向上取整,半闭半开区间,开区间+1。for index in range(1, t_index):  # 文章总数filename = "score" + str(index) + ".xlsx"exporter_excel = GetInformationToExcel(CSDNid, cookies, Referer, index, 100, filename)  # Replace with your usernameexporter_excel.export_to_excel()article_score = GetArticleScores(filename)article_score.write_scores_to_excel()print("获取完成")

执行完毕后,你会得到包含所有文章数据和质量分的Excel文件。

所有代码:

import json
import pandas as pd
from openpyxl import Workbook, load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import math
import requests# 批量获取文章信息并保存到excel
class GetInformationToExcel:def __init__(self, username, cookies, Referer, page, size, filename):self.username = usernameself.cookies = cookiesself.Referer = Refererself.size = sizeself.filename = filenameself.page = page# 发送HTTP GET请求到CSDN的API,获取文章列表def get_articles(self):url = "https://blog.csdn.net/community/home-api/v1/get-business-list"params = {"page": {self.page},"size": {self.size},"businessType": "blog","username": {self.username}}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Cookie': self.cookies,'Referer': self.Referer}try:response = requests.get(url, params=params, headers=headers)response.raise_for_status()data = response.json()return data.get('data', {}).get('list', [])except requests.exceptions.HTTPError as e:print(f"HTTP错误: {e.response.status_code} {e.response.reason}")except requests.exceptions.RequestException as e:print(f"请求异常: {e}")except json.JSONDecodeError:print("解析JSON失败")return []# 将文章列表转换为Pandas DataFrame,选择并重命名必要的列。def export_to_excel(self):df = pd.DataFrame(self.get_articles())df = df[['title', 'url', 'postTime', 'viewCount', 'collectCount', 'diggCount', 'commentCount']]df.columns = ['文章标题', 'URL', '发布时间', '阅读量', '收藏量', '点赞量', '评论量']wb = Workbook()sheet = wb.activefor r in dataframe_to_rows(df, index=False, header=True):sheet.append(r)for column in sheet.columns:max_length = 0column = [cell for cell in column]for cell in column:try:if len(str(cell.value)) > max_length:max_length = len(cell.value)except:passadjusted_width = (max_length + 5)sheet.column_dimensions[column[0].column_letter].width = adjusted_width# Save the workbookwb.save(self.filename)# 获取每篇文章的质量分,并将分数写入到Excel文件中
class GetArticleScores:def __init__(self, filepath):self.filepath = filepath# 发送HTTP POST请求到一个API,获取文章的质量分。@staticmethoddef get_article_score(article_url):url = "https://bizapi.csdn.net/trends/api/v1/get-article-score"headers = {"Accept": "application/json, text/plain, */*","X-Ca-Key": "203930474","X-Ca-Nonce": "b35e1821-05c2-458d-adae-3b720bb15fdf","X-Ca-Signature": "gjeSiKTRCh8aDv0UwThIVRITc/JtGJkgkZoLVeA6sWo=","X-Ca-Signature-Headers": "x-ca-key,x-ca-nonce","X-Ca-Signed-Content-Type": "multipart/form-data",}data = {"url": article_url}try:response = requests.post(url, headers=headers, data=data)response.raise_for_status()  # This will raise an error for bad responsesreturn response.json().get('data', {}).get('score', 'Score not found')except requests.RequestException as e:print(f"Request failed: {e}")return "Error fetching score"def get_scores_from_excel(self):"""读取Excel文件,获取文章URL列表。对每个URL调用 get_article_score 方法,获取分数列表。返回分数列表。"""df = pd.read_excel(self.filepath)urls = df['URL'].tolist()scores = [self.get_article_score(url) for url in urls]return scoresdef write_scores_to_excel(self):"""读取Excel文件到DataFrame。将获取的分数添加到DataFrame中。将更新后的DataFrame保存回Excel文件。"""df = pd.read_excel(self.filepath)df['质量分'] = self.get_scores_from_excel()df.to_excel(self.filepath, index=False)if __name__ == '__main__':# 请填写:已发文章总数量,cookies,你的首页Referer,你的id:CSDNidtotal = 145cookies = 'uuid_tt_dd=10'  # Simplified for brevityReferer = 'https://blog.csdn.net/q244645787'CSDNid = 'q244645787'# 下面是计算和获取t_index = math.ceil(total / 100) + 1  # 向上取整,半闭半开区间,开区间+1。for index in range(1, t_index):  # 文章总数filename = "score" + str(index) + ".xlsx"exporter_excel = GetInformationToExcel(CSDNid, cookies, Referer, index, 100, filename)  # Replace with your usernameexporter_excel.export_to_excel()article_score = GetArticleScores(filename)article_score.write_scores_to_excel()print("获取完成")

效果

相关文章:

Python功能制作之获取CSDN所有发布文章的对应数据

大家好,今天我要分享的是一个实用的Python脚本,它可以帮助你批量获取CSDN博客上所有发布文章的相关数据,并将这些数据保存到Excel文件中。此外,脚本还会为每篇文章获取一个质量分,并将这个分数也记录在Excel中。让我们…...

Backend - C# 基础知识

目录 一、程序结构 (一)内容 1. 命名空间声明 Namespace 2. 一个 class 类 3. class 方法(类方法) 4. class 属性 5. 一个 main 方法(程序入口) 6. 语句&表达式 7. 注释 (二)举例…...

HTML5新增的input元素类型:number、range、email、color、date等

HTML5 大幅度地增加与改良了 input 元素的种类,可以简单地使用这些元素来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 到目前为止,大部分浏览器都支持 input 元素的种类。对于不支持新增 input 元素的浏览器,input 元素被统一…...

00 Debian字符界面如何支持中文

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian字符界面如何支持中文 《傅老师Debian知识库系列之00》——原创 前言 傅老师Debian知识库特点: 1、拆解Debian实用技能; 2、…...

以太网中的各种帧结构

帧结构(Ethernet Frame Structure)介绍 以太网信号帧结构(Ethernet Signal Frame Structure),有被称为以太网帧结构,一般可以分为两类 —— 数据帧和管理帧。 按照 IEEE 802.3,ISO/IEC8803-3 …...

C++入门基础题:数组元素逆序(C++版互换方式)

1.题目&#xff1a; 数组元素逆置案例描述: 请声明一个5个元素的数组&#xff0c;并且将元素逆置. (如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1) 2.图解思路&#xff1a; 3.代码演示&#xff1a; #include<iostream>using namespace std;int main(){int a…...

3款自己电脑就可以运行AI LLM的项目

AnythingLLM、LocalGPT和PrivateGPT都是与大语言模型&#xff08;LLM&#xff09;相关的项目&#xff0c;它们允许用户在本地环境中与文档进行交互&#xff0c;但它们在实现方式和特点上存在一些差异。AnythingLLM使用Pinecone和ChromaDB来处理矢量嵌入&#xff0c;并使用OpenA…...

各云厂商取消免费一年期SSL证书

目录 第一次削减SSL证书有效期&#xff1a; SSL证书单次签发有效期可能再次削减&#xff1a; 目前市场趋势显现&#xff1a; 各类削减政策意味着什么&#xff1a; 上有政策、下有对策—怎么实现超长SSL证书有效期&#xff1a; 如何申请全自动化部署的SSL证书&#xff1a;…...

自动化测试高级控件交互方法:TouchAction、触屏操作、点按,双击,滑动,手势解锁!

在自动化测试领域中&#xff0c;TouchAction 是一种非常强大的工具&#xff0c;它允许我们模拟用户在设备屏幕上的各种触摸事件。这种模拟不仅限于简单的点击操作&#xff0c;还包括滑动、长按、多点触控等复杂的手势。 点按与双击 点按和双击是触屏设备上最基本的操作之一。…...

leetcode165.解密数字

题目表述&#xff1a; 这道题目和斐波那契数列以及跳台阶问题十分相似。 斐波那契数列&#xff1a;0、1、1、2、3、5, 8、13、21、34 …… leetcode跳台阶问题&#xff1a;1、1、2、3、5, 8、13、21、34....... 这类题目的特点都是第N项的结果等于前两项的和。 但是解密数…...

对为什么react需要时间分片,vue3不需要的浅学习

1、时间分片 时间分片指在让应用在cpu进行大量计算时也能与用户交互&#xff0c;但时间分片只能对大量cpu计算进行优化&#xff0c;无法优化复杂DOM操作&#xff0c;因为要确保用户正在操作的界面是最新。 web卡顿的场景&#xff1a; 1、cpu计算量不大&#xff0c;但dom操作…...

电脑干货分享 · 删除资源管理器导航栏 OneDrive 及 3D 对象

Win10资源管理器的左侧导航栏默认有一个OneDrive的项&#xff0c;但由于微软龟速的原因&#xff0c;OneDrive在国内基本很少有人使用&#xff0c;我们动手给它KO了&#xff01; 网上有很多这类的教程&#xff0c;但都是要手动修改注册表&#xff0c;对于小白来说&#xff0c;有…...

无人机之穿越机注意事项篇

一、检查设备 每次飞行前都要仔细检查穿越机的每个部件&#xff0c;确保所有功能正常&#xff0c;特别是电池和电机。 二、遵守法律 了解并遵循你所在地区关于无人机的飞行规定&#xff0c;避免非法飞行。 三、评估环境 在飞行前检查周围环境&#xff0c;确保没有障碍物和…...

防御课第一次作业第一天笔记整理

网络安全概述 网络安全&#xff08;Cyber Security&#xff09;是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断 中国网络安全市场近年来只增不…...

Git协作

文章目录 Git协作冲突冲突的发生情况解决冲突如何处理冲突 1 分支1.1 什么是Git分支1.2 创建分支 2 切换分支2.1 指向分支2.2 暂存分支切换分支与未提交更改的处理使用 Stash 临时保存更改Stash 的工作原理&#xff1a;场景设定使用 Git Stash 3 远程分支3.1 快进合并快进合并的…...

Three.js机器人与星系动态场景(四):封装Threejs业务组件

实际在写业务的时候不会在每个组件里都写几十行的threejs的初始化工作。我们可以 将通用的threejs的场景、相机、render、轨道控制器等进行统一初始化。同时将非主体的函数提到组件外部&#xff0c;通过import导入进组件。将业务逻辑主体更清晰一些。下面的代码是基于reactthre…...

亚马逊云科技 Amazon Bedrock 构建 AI 应用体验

前言 大模型应用发展迅速&#xff0c;部署一套AI应用的需求也越来越多&#xff0c;从头部署花费时间太长&#xff0c;然而亚马逊科技全托管式生成式 AI 服务 Amazon Bedrock&#xff0c;Amazon Bedrock 简化了从基础模型到生成式AI应用构建的复杂流程&#xff0c;为客户铺设了…...

程序员标准简历模板

链接: https://pan.baidu.com/s/1yMXGSSNba15b9hMXjA39aA?pwdb4ev 提取码: b4ev 3年工作经验简历 链接: https://pan.baidu.com/s/1OO7n1lRL6AkhejxYC9IyDA?pwdfmvv 提取码: fmvv 优秀学员简历 链接: https://pan.baidu.com/s/106Vkw_ulOInI47_5mDySSg?pwduudc 提取码: uu...

物联网设计竞赛_10_Jetson Nano中文转汉语语音

在windows中pyttsx3可以让汉字文本输出中文语音&#xff0c;但是在jetson上只能用英文说话 import pyttsx3def hanyu(test):engine pyttsx3.init()rate engine.getProperty(rate)engine.setProperty(rate,125)engine.say(test)engine.runAndWait() hanyu(你好) #engine.save…...

XML Schema 指示器

XML Schema 指示器 1. 引言 XML Schema 是一种用于定义 XML 文档结构和内容的语言。它提供了一种强大的方式来描述 XML 文档中允许的元素、属性和数据类型。XML Schema 指示器是在 XML Schema 定义中使用的一些特殊元素和属性,它们用于指示 XML 处理器如何解析和验证 XML 文…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...