【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.mzph.cn/news/744154.shtml

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

相关文章

WPF —— Calendar日历控件详解

1: Calendar的简介 日历控件用于创建可视日历,让用户选择日期并在选择日期时触发事件。 DisplayMode 用来调整日历显示模式,分为Month、Year 和Decade 三种。如下是None 2:Calendar控件常用的属性 SelectionMode 选中日历的类…

深入理解指针——C语言

目录 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断言 8. 指针的使用和传址调用 9. 数组名的理解 10. 使用指针访问数组 11. 一维数组传参的本质 12. 冒泡排序 13. 二级指针 14. 指针数组 15. 指…

如何在Windows系统安装Node.js环境并制作html页面发布公网远程访问?

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

创建一个Django项目

安装python、pip、Django 找不到python命令,请将C:\Python33、C:\Python33\Lib、C:\Python33\libs三个地址加入环境变量。 get-pip.py下载:https://bootstrap.pypa.io/ django版本需要与python版本对应,并将C:\Python33\Scripts加入环境变…

CNC机加工引入复合机器人可以提高生产效率,降低成本

CNC加工企业在过去依赖大量的人工来完成生产线上的各项任务,包括CNC机床的上下料、物料搬运以及部分装配工作。然而,随着产能需求的不断增长和人工成本的持续上升,企业逐渐意识到自动化升级的重要性与迫切性。 面临的挑战与需求: …

Layer1 新星 Partisia Blockchain 撑起隐私保护伞,助你无忧加密交易!

信息纷繁芜杂、真假掺半的 Web3 行业,如何才能更快、更安全地实现快速交易?Partisia Blockchain 或许交出了一份满意的技术答卷。致力于隐私保护、互操作性和可持续创新的 Layer1 区块链新星,Partisia Blockchain 以安全公平标榜,…

VScode(Python)使用ssh远程开发(Linux系统树莓派)时,配置falke8和yapf总结避坑!最详细,一步到位!

写在前面:在Windows系统下使用VScode时可以很舒服的使用flake8和yapf,但是在ssh远程开发树莓派时,我却用不了,总是出现问题。当时我就开始了漫长的探索求知之路。中间也请教过许多大佬,但是他们就讲“能用不就行了&…

Jeff Bezos的投资正开始见效

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Vue+wow.js+animate.css实现动画效果

1.介绍 Wow.js 是一个轻量级的 JavaScript 库,用于在网页滚动时实现动画效果。基于 CSS3 的动画库 Animate.css,并通过触发 CSS 动画类来创建各种引人注目的过渡和动画效果。 使用 Wow.js,可以很容易地为网页中的元素添加动画效果&#xff…

MVC架构模式学习笔记(动力节点老杜2022)

GitHub代码笔记:laodu-mvc: 动力节点学习javaweb中的mvc笔记。 文章目录 1.视频链接 2.不使用MVC架构模式程序存在的缺陷 3.MVC架构模式理论基础 4.JavaEE设计模式-DAO模式 5.pojo & bean & domain 6.业务层抽取以及业务类实现 7.控制层 8.MVC架构模式与三…

ElasticSearch之Nested对象

写在前面 本文看下es的nested嵌套对象相关内容。 1:es用了啥范式? 在关系型数据库中定义了6大数据库范式,即1,2,3,BC,4,5的NF(normal form),分别如下: 1N…

学习编程为什么选择C/C++,那么C++的强大之处到底体现在哪里呢?

学习编程为什么选择C/C,那么C的强大之处到底体现在哪里呢? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共…

ctf_show笔记篇(web入门---代码审计)

301:多种方式进入 从index.php页面来看 只需要访问index.php时session[login]不为空就能访问 那么就在访问index.php的时候上传login 随机一个东西就能进去从checklogin页面来看sql注入没有任何过滤 直接联合绕过 密码随意 还有多种方式可以自己去看代码分析 30…

力扣串题:字符串中的第二大数字

此题的精妙之处在于char类型到int类型的转化&#xff0c;需要运算来解决 int secondHighest(char * s) {int max1-1;int max2-1;int szstrlen(s);int i 0 ;for(i0;i<sz;i){if(s[i]>0&&s[i]<9){if((s[i]-0)>max1){max2max1;max1s[i]-0;}else if((s[i]-0)&l…

峟思仪器助力尾矿库安全监测

在矿业领域&#xff0c;尾矿库的安全监测是保障矿山持续、安全运营的关键环节。尾矿库通常用于存放矿山开采过程中产生的固体废物&#xff0c;如果管理不善&#xff0c;可能会造成重大的安全事故&#xff0c;对环境和人类健康造成严重威胁。因此&#xff0c;采用先进的监测技术…

Sqllab第一关通关笔记

知识点&#xff1a; 明白数值注入和字符注入的区别 数值注入&#xff1a;通过数字运算判断&#xff0c;1/0 1/1 字符注入&#xff1a;通过引号进行判断&#xff0c;奇数个和偶数个单引号进行识别 联合查询&#xff1a;union 或者 union all 需要满足字段数一致&…

机界先锋:Figure 01实现全面沟通与AGI通用人工智能的征途

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

yum安装mysql 数据库tab自动补全

centos7上面没有mysql&#xff0c;它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

2024年大学生买腾讯云_腾讯云大学生服务器优惠

腾讯云学生服务器优惠活动「云校园」轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置112元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G3M公网带宽配置842.4元一年&#xff0c;腾讯云服务器网txyfwq.com分享2…

H12-811_128

128.如下图所示的网络&#xff0c;两台交换机之间通过四条链路相连&#xff0c;COPPER指电接口&#xff0c;FIBR指光接口&#xff0c;则以下哪两个接口可以实现链路聚合? A.G0/0/3和FE0/0/3 B.G0/0/3和G0/0/2 C.G0/0/2和FE0/0/3 D.G0/0/2和G0/0/1 答案&#xff1a;BD 注释&am…