🛠️ 环境准备
在开始编写代码之前,我们需要进行一些环境准备。以下是所需的环境和库:
- 操作系统:Windows
- 编程语言:Python 3
- 编辑器:VSCode(可选)
安装所需的库:
- requests:用于发送HTTP请求
- MultipartEncoder:用于构造POST请求的请求体
可以使用以下命令在命令行中安装这些库:
pip install requests
pip install requests_toolbelt
请确保已经正确安装了Python 3,并且在编写代码之前设置了Python 3的环境变量。
🎯 分析目标数据
在进行爬取之前,首先需要打开目标网页并使用浏览器的开发者工具,以获取所需的请求 URL 和请求标头。
第一步:打开目标网页
第二步:使用开发者工具
按下键盘上的F12键,打开浏览器的开发者工具。然后点击"Network"选项卡,这将显示浏览器发送的网络请求。
第三步:获取请求 URL 和请求标头
在开发者工具中,可以看到所有的网络请求。找到目标请求,并点击查看其详情。
在请求详情中,我们可以找到标头,查看请求的URL和请求标头。这些信息将在后续的代码编写中使用。
点击负载找到请求参数
第四步:分析请求url,构造参数字典
根据以上信息可以得到,请求url是由两部分构成,
url = "https://blog.csdn.net/community/home-api/v1/get-business-list"
参数:
page: 2
size: 20
businessType: lately
noMore: false
username: mingfeng4923
🐍 获取所有文章代码编写
⭐️ 获取单页的文章列表
✅首先,需要导入所需的库:
import requests
from requests_toolbelt import MultipartEncoder
✅接下来,将发送GET请求并获取数据内容:
url = 'urls = "https://blog.csdn.net/community/home-api/v1/get-business-list"'
# 使用了常见的浏览器User-Agent来模拟浏览器请求
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0"
}
lb_params = {
"page": 1,
"size": "20",
"businessType": "blog",
"orderby": "",
"noMore": "false",
"year": "",
"month": "",
"username": "mingfeng4923",
}
res = requests.get(url=urls, headers=headers, params=lb_params)
✅使用json方法处理数据,并读取文章列表信息,文章信息在data>list下
data_list = res.json()["data"]["list"]
✅遍历列表输出文章链接和文章标题
for data in data_list:
print(data["url"],data["title"])
✅结果:
⭐️ 获取所有页的文章
修改页码,循环发送GET请求获取文章列表信息,直到返回的列表为空停止循环。
要获取所有文章信息,我们需要对请求的URL进行修改。URL中的参数
page
代表当前页码,我们可以通过修改该参数的值来获取不同页的文章列表。
🫸 首先,我们定义一个函数get_post_list_urls
,该函数用于发送GET请求获取文章列表信息。
def get_post_list_urls(page, username):
# 构造请求URL和请求参数
url = "https://blog.csdn.net/community/home-api/v1/get-business-list"
params = {
"page": page,
"size": "20",
"businessType": "blog",
"orderby": "",
"noMore": "false",
"year": "",
"month": "",
"username": username,
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0"
}
try:
# 发送GET请求
response = requests.get(url=url, headers=headers, params=params)
# 解析响应数据
data_list = response.json()["data"]["list"]
return data_list
except Exception as e:
print(f"获取文章列表失败:{e}")
return []
🫸 然后,我们可以使用该函数来获取所有文章的信息。
res = [] # 存储所有文章信息的列表
page = 1 # 初始页码
# 循环获取文章列表信息
while True:
data_list = get_post_list_urls(page, UserName)
page += 1
if data_list:
res.extend(data_list)
else:
break
输出查看一下结果
# 遍历输出文章链接和标题
COUNT = len(res)
for data in res:
print(data["url"],data["title"])
print(f"[+] [{COUNT}篇]")
📑 CSDN质量分查询
接下来是对博文质量分数的查询。首先打开目标网页并使用浏览器的开发者工具。然后复制粘贴要查询的文章链接,点击查询按钮。在开发者工具中查看请求的请求 URL 和请求标头,注意这次要用POST方法进行请求。构造查询函数,使用requests
库发送POST请求获取博文的质量分数。
要查询博文的质量分数,我们需要先打开目标网页并使用浏览器的开发者工具,以查看请求的URL和请求标头。
第一步:打开目标网页
在浏览器中打开目标网页。
目标链接:https://www.csdn.net/qc
第二步:使用开发者工具
按下键盘上的F12键,打开浏览器的开发者工具。然后复制要查询的文章链接,点击查询。
在开发者工具中就可以查询到文章的信息。
第三步:获取请求 URL 和请求标头
在开发者工具中,可以看到所有的网络请求。找到目标请求,并点击查看其详情。
在请求详情中,我们可以找到标头,查看请求的URL和请求标头。这些信息将在后续的代码编写中使用。
根据以上信息可以得到,请求url和参数信息,使用的是post方法
请求url : https://bizapi.csdn.net/trends/api/v1/get-article-score
参数:url: https://blog.csdn.net/mingfeng4923/article/details/131423637
第四步:构造查询函数
在Python中,我们可以定义一个函数get_quality_score
,用于发送POST请求获取博文的质量分数。
def get_quality_score(article_url):
# 构造请求URL和请求体
url = "https://bizapi.csdn.net/trends/api/v1/get-article-score"
params = {"url":article_url}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0",
"Content-Type": "application/json",
}
try:
# 发送POST请求
response = requests.post(url=url, headers=headers, params=params, timeout=10,)
# 解析响应数据
score = response.json()["data"]["score"]
return score
except Exception as e:
print(f"获取质量分数失败:{e}")
return None
报错401解决方法
这样直接访问就会出错,status_code
结果是401
这里需要使用requests_toolbelt
库中的MultipartEncoder
方法:
from requests_toolbelt import MultipartEncoder
...
params = MultipartEncoder({"url": article_url})
headers['Content-Type'] = params.content_type # 修改Content-Type
res = requests.post(
url,
headers=headers,
data=params, # 使用data
timeout=10,
)
status_code
返回200,正常访问
返回数据:
code: 200
data: {
article_id: "131423637"
message: "文章质量良好"
nickname: "mingfeng4923"
post_time: "2023-06-27 19:15:12"
score: 92
title: "Python爬虫:Scrapy框架"
username: "mingfeng4923"
}
message: "success"
第五步:循环查询质量分
🌖完整代码
整合以上步骤,使用Python编写完整代码。首先获取文章列表链接,然后遍历列表获取每篇文章的质量分数。输出文章链接和质量分数。
# CSDN个人博文质量查询
import requests
from requests_toolbelt import MultipartEncoder
UserName = "mingfeng4923"
# 获取文章列表
def get_post_list_urls(page, username):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0"
}
lb_params = {
"page": page,
"size": "20",
"businessType": "blog",
"orderby": "",
"noMore": "false",
"year": "",
"month": "",
"username": username,
}
urls = "https://blog.csdn.net/community/home-api/v1/get-business-list"
try:
res = requests.get(url=urls, headers=headers, params=lb_params)
# print(res.status_code)
data_list = res.json()["data"]["list"]
return data_list
except Exception as e:
print(f"[+] [ending] [{e}]")
return 0
# 查询质量分数
def get_sorce(article_url):
url = "https://bizapi.csdn.net/trends/api/v1/get-article-score"
headers = {
# headers
}
params = MultipartEncoder({"url": article_url})
headers["Content-Type"] = params.content_type
try:
res = requests.post(
url,
headers=headers,
data=params,
timeout=10,
)
# print(f"[+] [{article_url}] [{res.status_code}] ")
sorce = res.json()["data"]["score"]
# print(sorce)
return sorce
except Exception as e:
print(f"[+] [分数获取失败] [{article_url}] [{res.status_code}] [{e}]")
return 0
UserName = 'mingfeng4923'
res = []
page = 1
while True:
data_list = get_post_list_urls(page, UserName)
page += 1
if data_list == 0 or len(data_list) == 0:
break
else:
res += data_list
for data in res:
article_url = data["url"]
print(article_url,get_sorce(article_url))
通过以上代码,我们可以获取指定CSDN用户的所有文章链接,并查询每篇文章的质量分数。这对于分析文章的质量和影响力非常有用。你可以根据自己的需求对代码进行进一步的修改和扩展。
Happy coding!🎉