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("获取完成")

效果

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

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

相关文章

多周期路径的约束与设置原则

本节将回顾工具检查建立保持时间的原则,接下来介绍设置多周期后的检查原则。多周期命令是设计约束中常用的一个命令,用来修改默认的建立or保持时间的关系。基本语法如下 默认的建立时间与保持时间的检查方式 DC工具计算默认的建立保持时间关系是基于时钟…

Python实战:拥有设闹钟功能的可视化动态闹钟的实现

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

6-5,web3浏览器链接区块链(react+区块链实战)

6-5,web3浏览器链接区块链(react区块链实战) 6-5 web3浏览器链接区块链(调用读写合约与metamask联动) 6-5 web3浏览器链接区块链(调用读写合约与metamask联动) 这里就是浏览器端和智能合约的交…

高职Web全栈式开发实训室解决方案

一、专业背景 随着网络普及和发展,网站作为一种很强大的工具和平台愈来愈融入了人们的生活,而与用户关系最密切的前端技术也逐渐获得应有的重视。咱们能够看到前端重构的行业发展潜力巨大,各大知名的网络公司对前端人才的求饥若渴。近年来HT…

DID差分模型案例集(传统DID、队列DID、渐近DID、空间DID、PSM-DID)

双重差分(DID)模型是一种广泛应用于经济学、社会学等领域的统计方法,主要用于评估政策或事件的因果效应。以下是DID模型几个重要变体的简要介绍: 1、传统DID(Traditional DID):这是DID模型的基…

【Qt 从基础】创建一个 Qt 项目后,自动生成的代码和文件分析

文章目录 1. Sources 目录下,main.cpp 文件的分析🐧2. Headers 目录下,widget.h 文件的分析🐧3. Sources 目录下,widget.cpp 文件的分析🐧4. Forms 目录下,widget.ui 文件的分析🐧5.…

目标检测基本标注工具-labelImg安装与使用

🍉一、安装 1.1 打开conda创建虚拟环境🎈 conda create -n labelImg python3.8 -y 1.2 激活labelImg虚拟环境🎈 activate labelImg1.3 安装labelImg🎈 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lab…

Protobuf: 大数据开发中的高效数据传输利器

作为一名大数据开发者,我经常需要处理海量的数据传输和存储。在这个过程中,选择一个高效、可靠的数据序列化工具至关重要。今天,我想和大家分享一下我在项目中使用 Protobuf 的经历。 目录 故事背景Protobuf 简介优点: 实战案例示…

uView、ColorUI与Vant框架的深入分析与案例实践

摘要: 随着移动开发技术的不断发展,框架的选择对于项目的成功至关重要。本文将对uView、ColorUI和Vant这三个主流移动端框架进行深入分析,探讨它们的优缺点,并通过实际案例展示如何根据项目需求选择合适的框架。 一、引言 在移动…

【人工智能】-- 受限玻尔兹曼机

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉受限玻尔兹曼机 🍈RBM的结构 🍍RBM的架构图 🍍RBM的经典实现 &…

Python中对asyncio的实际使用

前言:一般涉及异步编程我都无脑用celery,但是最近在做一个项目,项目不大,也不涉及定时任务,所以就用了asyncio。 asyncio是python自带的模块,比celery轻量,使用起来也简单。以前学习过&#xf…

论文阅读【时空+大模型】ST-LLM(MDM2024)

论文阅读【时空大模型】ST-LLM(MDM2024) 论文链接:Spatial-Temporal Large Language Model for Traffic Prediction 代码仓库:https://github.com/ChenxiLiu-HNU/ST-LLM 发表于MDM2024(Mobile Data Management&#xf…

ArrayList----源码分析

源码中的简介: List接口的可调整数组实现。实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector,只是它是不同…

TC软件许可优化解决方案

TC功能说明 Teamcenter 软件是西门子面向全球范围开发的数字化全生命周期管理(PLM)系统,将人员、产品、流程、知识有机联系在一起,以帮助企业实现数字化协同、数字化赋能、 数字化转型,从而推动企业产品创新与效率提升…

Java链表LinkedList经典题目

一.LinkedList的方法 首先先看一下链表的方法: 方法解释boolean add(E e)尾插void add(int index, E element)将 e 插入到 index 位置boolean addAll(Collection c)尾插 c 中的元素E remove(int index)删除 index 位置元素boolean remove(Object o)删除遇到的第一…

【EIScopus稳检索-高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024)

大会官网:www.icbdss.org 大会时间:2024年8月16-18日 大会地点:中国-上海 接受/拒稿通知:投稿后1-2周内 收录检索:EI,Scopus *所有参会者现场均可获取参会证明,会议通知(邀请函)&…

2022 RoboCom省赛题目解析

题目解析&#xff1a;这就是一题很简单的模拟&#xff0c;直接上代码&#xff1b; #include<iostream> using namespace std; const int N 10010; int arr[N]; int main() {int n , m;cin >> n >> m;int sum 0;int res 0;for(int i 0; i < n;i ) cin…

系统服务综合作业01

题目&#xff1a; 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 no…

程序使用多进程,打包.exe后,程序陷入死循环

最近写了一个深度学习程序&#xff0c;用cxfreezee打包exe后&#xff0c;在本地运行突然出现死循环&#xff0c;明明在pycharm运行一切正常。 排查了问题&#xff0c;怀疑是多进程的原因&#xff0c;解决办法&#xff1a; 在你的主程序前添加一行代码&#xff1a; if __name_…

Pandas数学函数大揭秘:让数据处理变得如此简单高效,轻松玩转数据分析新纪元!

1.导包 # 导包 import numpy as np import pandas as pd2.聚合函数 df pd.DataFrame(datanp.random.randint(0,100,size(5,3))) df01203550281552376231419335895434679917 # 列非空元素的数量 df.count()0 5 1 5 2 5 dtype: int64# 行非空元素的数量 df.count(ax…