【2024-完整版】python爬虫 批量查询自己所有CSDN文章的质量分:附整个实现流程

【2024】批量查询CSDN文章质量分

  • 写在最前面
  • 一、分析获取步骤
  • 二、获取文章列表
    • 1. 前期准备
    • 2. 获取文章的接口
    • 3. 接口测试(更新重点)
  • 三、查询质量分
    • 1. 前期准备
    • 2. 获取文章的接口
    • 3. 接口测试
  • 四、python代码实现
    • 1. 分步实现
    • 2. 批量获取文章信息
    • 3. 从excel中读取文章url,查询质量分,再将质量分添加到excel
    • 4. 全部代码


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

前些天发现了一个人工智能学习网站,内容深入浅出、易于理解。如果对人工智能感兴趣,不妨点击查看。

写在最前面

之前的代码一直报错521,不清楚什么原因
因此重新分析整个过程,并对代码进行更新

结果如图

在这里插入图片描述

参考:
批量获取CSDN文章对文章质量分进行检测,有助于优化文章质量
【python】我用python写了一个可以批量查询文章质量分的小项目(纯python、flask+html、打包成exe文件)

一、分析获取步骤

  1. 获取博主的所有文章,并且拿到对应的url地址。(需要分析接口)
  2. 获取到url地址,我们需要使用官方查询质量分网页的接口进行请求。(需要分析接口)
  3. 接口分析完成后,我们就可以按照我们的需求进行代码编写了。

二、获取文章列表

1. 前期准备

浏览器访问需要获取文章的博主首页地址,并且打开开发者工具快捷键F12

然后点击网络选项,我们在刷新页面可以看到发送的请求地址。

然后我们选择XHR过滤掉我们不需要看到请求,但是这里面也没有我们需要的请求,但是没关系,我们只要想一下什么情况下会发送请求获取文章呢?答案就是下滑底部后,会重新发送请求获取新的文章并且渲染到页面。

点击删除请求这样我们下拉就可以清晰看到请求的接口数据

发现就是该接口发送的请求获取文章数据

在这里插入图片描述

2. 获取文章的接口

我们主要还是研究获取文章的接口
看请求的 url,是一个 GET 请求。

在这里插入图片描述

请求URL:
https://blog.csdn.net/community/home-api/v1/get-business-list

https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=wtyuong

这个接口也比较简单只需要携带4个参数:

  • 页码:page 第几页
  • 页数:size 页码展示的条数
  • 用户名称:username 需要查询的博主名(csdn id)
  • 业务类型:businessType 默认使用 blog 这个类型对应

分析响应体:可以返回每篇文章的地址、阅读量、评论量等数据。

['title', 'url', 'postTime', 'viewCount', 'collectCount', 'diggCount', 'commentCount']
['文章标题', 'URL', '发布时间', '阅读量', '收藏量', '点赞量', '评论量']

在这里插入图片描述

3. 接口测试(更新重点)

用ApiPost这个软件来进行接口测试

发现实际上,如果只发送url是会报错的,提示:请进行安全验证

在这里插入图片描述

服务器要求进行“安全验证”以继续访问。这通常是网站的防爬机制之一,用于识别和阻止自动化的访问尝试。面对这种情况,有几个可能的解决方案:

  1. 用户代理(User-Agent):确保你的请求头中包含了一个合理的用户代理(User-Agent)字符串。有些网站会检查这个字段来判断请求是否来自真实的浏览器用户。尝试使用常见浏览器的用户代理字符串。

  2. Cookies:某些网站要求请求携带有效的cookies来通过安全验证。你可以先手动访问该网站,通过浏览器获取到有效的cookies,并在你的爬虫请求中携带这些cookies。

  3. 处理JavaScript挑战:如果网站使用JavaScript生成动态内容或执行安全验证,你可能需要使用Selenium或Puppeteer这类工具,它们可以模拟真实的浏览器环境,执行JavaScript代码,并处理复杂的交互。

  4. 验证码识别:如果需要验证码验证,你可能需要集成验证码识别服务(如Google reCAPTCHA解决方案)或使用OCR(光学字符识别)技术尝试自动识别和填写验证码,虽然这可能面临法律和道德问题。

  5. 频率限制:确保你的请求频率不要太高,高频率的请求更容易触发网站的安全防护机制。尝试降低请求频率,或者在连续的请求之间增加延时。

经过测试,请求头只需要包括Cookies、Referer参数即可。

在这里插入图片描述

nice!

关于如何获取cookie:

在这里插入图片描述

三、查询质量分

流程和上述一样

1. 前期准备

先去质量查询地址:https://www.csdn.net/qc

在这里插入图片描述

2. 获取文章的接口

输入任意一篇文章地址进行查询,同时检查页面,在Network选项下即可看到调用的API的请求地址、请求方法、请求头、请求体等内容:

看请求的 url,是一个 POST 请求。

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

在这里插入图片描述

POST 请求携带参数是 url。

在这里插入图片描述

我们得到的响应数据:文章id、分数、消息、发布时间。

在这里插入图片描述

3. 接口测试

请求头里面很多参数是不需要的,我们用ApiPost这个软件来测试哪些是必要参数。

需要注意的是请求体的类型是form-data类型

在这里插入图片描述

经过测试,请求头只需要下面这几个参数即可。

请求头分析
X-Ca-Key:使用自己浏览器的
X-Ca-Nonce:使用自己浏览器的
X-Ca-Signature:使用自己浏览器的
X-Ca-Signature-Headers:x-ca-key,x-ca-nonce
X-Ca-Signed-Content-Type:multipart/form-data
Accept :application/json, text/plain, /

在这里插入图片描述

响应体分析:

  • score:文章的分数
  • message:给出的建议

在这里插入图片描述

四、python代码实现

1. 分步实现

为了便于理解,把程序分为2个部分:

  • 批量获取文章信息,保存为excel文件;
  • 从excel中读取文章url,查询质量分,再将质量分添加到excel。

2. 批量获取文章信息

# 批量获取文章信息并保存到excel
class CSDNArticleExporter:def __init__(self, username, cookies, Referer, page, size, filename):self.username = usernameself.cookies = cookiesself.Referer = Refererself.size = sizeself.filename = filenameself.page = pagedef 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 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Cookie': self.cookies,  # Setting the cookies string directly in headers'Referer': self.Referer}try:response = requests.get(url, params=params, headers=headers)response.raise_for_status()  # Raises an HTTPError if the response status code is 4XX or 5XXdata = 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 []def export_to_excel(self):df = pd.DataFrame(self.get_articles())df = df[['title', 'url', 'postTime', 'viewCount', 'collectCount', 'diggCount', 'commentCount']]df.columns = ['文章标题', 'URL', '发布时间', '阅读量', '收藏量', '点赞量', '评论量']# df.to_excel(self.filename)# 下面的代码会让excel每列都是合适的列宽,如达到最佳阅读效果# 你只用上面的保存也是可以的# Create a new workbook and select the active sheetwb = Workbook()sheet = wb.active# Write DataFrame to sheetfor r in dataframe_to_rows(df, index=False, header=True):sheet.append(r)# Iterate over the columns and set column width to the max length in each columnfor 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)

在这里插入图片描述

3. 从excel中读取文章url,查询质量分,再将质量分添加到excel

class ArticleScores:def __init__(self, filepath):self.filepath = filepath@staticmethoddef get_article_score(article_url):url = "https://bizapi.csdn.net/trends/api/v1/get-article-score"# TODO: Replace with your actual headersheaders = {"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):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):df = pd.read_excel(self.filepath)df['质量分'] = self.get_scores_from_excel()df.to_excel(self.filepath, index=False)

4. 全部代码

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 CSDNArticleExporter:def __init__(self, username, cookies, Referer, page, size, filename):self.username = usernameself.cookies = cookiesself.Referer = Refererself.size = sizeself.filename = filenameself.page = pagedef 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 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3','Cookie': self.cookies,  # Setting the cookies string directly in headers'Referer': self.Referer}try:response = requests.get(url, params=params, headers=headers)response.raise_for_status()  # Raises an HTTPError if the response status code is 4XX or 5XXdata = 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 []def export_to_excel(self):df = pd.DataFrame(self.get_articles())df = df[['title', 'url', 'postTime', 'viewCount', 'collectCount', 'diggCount', 'commentCount']]df.columns = ['文章标题', 'URL', '发布时间', '阅读量', '收藏量', '点赞量', '评论量']# df.to_excel(self.filename)# 下面的代码会让excel每列都是合适的列宽,如达到最佳阅读效果# 你只用上面的保存也是可以的# Create a new workbook and select the active sheetwb = Workbook()sheet = wb.active# Write DataFrame to sheetfor r in dataframe_to_rows(df, index=False, header=True):sheet.append(r)# Iterate over the columns and set column width to the max length in each columnfor 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)class ArticleScores:def __init__(self, filepath):self.filepath = filepath@staticmethoddef get_article_score(article_url):url = "https://bizapi.csdn.net/trends/api/v1/get-article-score"# TODO: Replace with your actual headersheaders = {"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):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):df = pd.read_excel(self.filepath)df['质量分'] = self.get_scores_from_excel()df.to_excel(self.filepath, index=False)if __name__ == '__main__':total = 10     #已发文章总数量# TODO:调整为你自己的cookies,Referer,CSDNid, headerscookies = 'uuid_tt_dd=10'  # Simplified for brevityReferer = 'https://blog.csdn.net/WTYuong?type=blog'CSDNid = 'WTYuong't_index = math.ceil(total/100)+1 #向上取整,半闭半开区间,开区间+1。# 获取文章信息# CSDNArticleExporter("待查询用户名", 2(分页数量,按总文章数量/100所得的分页数),总文章数量仅为设置为全部可见的文章总数。# 100(最大单次查询文章数量不大于100), 'score1.xlsx'(待保存数据的文件,需要和下面的一致))for index in range(1,t_index): #文章总数filename = "score"+str(index)+".xlsx"exporter = CSDNArticleExporter(CSDNid, cookies, Referer, index, 100, filename)  # Replace with your usernameexporter.export_to_excel()# 批量获取质量分score = ArticleScores(filename)score.write_scores_to_excel()

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

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

相关文章

Java推荐算法——特征加权推荐算法(以申请学校为例)

加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知,推荐算法有很多种,例如: 1.加权推荐:分为简单的特征加权,以及复杂的混合加权。主要…

软件功能测试内容有哪些?湖南长沙软件测评公司分享

软件功能测试主要是验证软件应用程序的功能,且不管功能是否根据需求规范运行。是通过给出适当的输入值,确定输出并使用预期输出验证实际输出来测试每个功能。也可以看作“黑盒测试”,因为功能测试不用考虑程序内部结构和内部特性,…

【词云图绘制实战】——数据准备、清洗、多形式展示

文章目录 1 手动输入文本1.1 加载包1.2 分词处理1.2.1 普通分词方式1.2.2 hmm分词 1.2 词云图绘制1.2.1 wordcloud词云图1.2.2 wordcloud2词云图 2 读取文本数据2.1 读取文本数据2.2 分词处理2.3 词云图绘制2.3.1 wordcloud词云图2.3.2 wordcloud2词云图2.3.3 letterCloud词云图…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数,例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数,在小程序端的时候测试并无问题,但是发行到H5时首页加载会造成参数获取…

SpringMVC10、拦截器

10、拦截器 10.1、概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别:拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&…

快快快!阿里通义灵码限时福利100%中奖,快来领取你的盲盒礼品!

限时福利100%中奖,快来领取你的盲盒礼品! 通义灵码的「体验灵码赢取百万 AI 盲盒」的活动正在火热进行中,参与活动后领取 AI 盲盒,还可以邀请更多好友参与,有机会赢取 iPhone15、机械键盘等大奖! 点击参与…

案例分析:分库分表后,我的应用崩溃了

今天我们主要分析一个案例,那就是分库分表后,我的应用崩溃了。 前面介绍了一种由于数据库查询语句拼接问题,而引起的一类内存溢出。下面将详细介绍一下这个过程。 假设我们有一个用户表,想要通过用户名来查询某个用户&#xff0…

C goto 语句

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语…

Python数据分析毕业设计选题30个及框架大全

当涉及到Python数据分析毕业设计选题时,以下是30个选题建议: 1. 分析社交媒体数据,预测用户行为模式。 2. 使用机器学习算法分析电影评分数据,预测电影票房。 3. 分析股票数据,预测股票的涨跌趋势。 4. 分析用户购…

Kubernetes弃用Dockershim,转向Containerd:影响及如何应对

Kubernetes1.24版本发布时,正式宣布弃用Dockershim,转向Containerd作为默认的容器运行环境。Kubernetes以CRI(Container Runtime Interface)容器运行时接口制定接入准则,用户可以使用Containerd、CRI-O、CRI- Dockerd及其他容器运行时作为Kub…

打破数据孤岛,TDengine 与 Tapdata 实现兼容性互认证

当前,传统行业正面临着数字化升级的紧迫需求,但海量时序数据的处理以及数据孤岛问题却日益突出。越来越多的传统企业选择引入时序数据库(Time Series Database,TSDB)升级数据架构,同时,为了克服…

一个注解搞定 SpringBoot 接口防刷,还有谁不会?

boolean login accessLimit.needLogin(); String key request.getRequestURI(); //如果需要登录 if(login){ //获取登录的session进行判断 //… key“”“1”; //这里假设用户是1,项目中是动态获取的userId } //从redis中获取用户访问的次数 AccessKey ak AccessK…