3. 爬取自己CSDN博客列表(自动方式)(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录

  • 步骤
    • 打开谷歌浏览器
    • 输入网址
    • 按F12进入调试界面
    • 点击网络,清除历史消息
    • 按F5刷新页面
    • 找到接口(community/home-api/v1/get-business-list)
      • 接口解读
    • 撰写代码获取博客列表
      • 先明确返回信息格式
        • json字段解读
      • Apipost测试接口
      • 编写python代码(注意有反爬虫策略,需要设置请求头)(成功)

1. 如何爬取自己的CSDN博客文章列表(获取列表)(博客列表)(手动+python代码方式)

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

步骤

打开谷歌浏览器

输入网址

https://dontla.blog.csdn.net/?type=blog

按F12进入调试界面

点击网络,清除历史消息

在这里插入图片描述

按F5刷新页面

找到接口(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=Dontla

在这里插入图片描述

接口解读

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

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

这是一个HTTP GET请求的接口,用于获取CSDN博客网站上的业务列表信息。具体来说,它是用于获取某个用户的博客文章列表。让我们逐个分析URL中的参数:

  • page=1:这个参数表示请求的页面编号,设为1意味着请求第一页的数据。

  • size=20:这个参数表示每页显示的记录数。这里,每页显示20条记录。

  • businessType=blog:这个参数指定了业务类型,此处为"blog",所以它应该是用来获取博客文章的。

  • orderby=:这个参数应该是用来指定排序方式的,但在这个请求中并没有具体值,可能默认为某种排序方式,如按发布时间降序等。

  • noMore=false:这个参数可能是用来判断是否还有更多的记录可以获取。如果设置为false,表示可能还有更多的记录。

  • year= & month=:这两个参数可能是用来筛选特定年份和月份的博客文章,但在这个请求中并没有具体值,因此可能会返回所有时间段的文章。

  • username=Dontla:这个参数指定了用户名,意味着这个请求可能用来获取名为"Dontla"的用户的博客文章列表。

撰写代码获取博客列表

先明确返回信息格式

我们将https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=1&businessType=blog&orderby=&noMore=false&year=&month=&username=Dontla拷贝到浏览器url栏打开:

在这里插入图片描述

全选拷贝,将文字粘贴到编辑器并格式化:

在这里插入图片描述

{“code”:200,“message”:“success”,“traceId”:“47d3f9ad-bfc0-4604-b386-48b0e0b40c8d”,“data”:{“list”:[{“articleId”:132295415,“title”:“shellcheck警告:Declare and assign separately to avoid masking return values.shellcheck(SC2155)”,“description”:“ShellCheck的SC2155警告是关于在shell脚本中正确处理命令返回值的一个重要提示。通过将声明和赋值分开进行,我们可以确保命令的返回值不会被误导,并且在命令执行失败时,脚本能够正确地捕获并处理错误。”,“url”:“https://dontla.blog.csdn.net/article/details/132295415”,“type”:1,“top”:false,“forcePlan”:false,“viewCount”:8,“commentCount”:0,“editUrl”:“https://editor.csdn.net/md?articleId=132295415”,“postTime”:“2023-08-15 13:16:23”,“diggCount”:0,“formatTime”:“8 小时前”,“picList”:[“https://img-blog.csdnimg.cn/a0eb894421994488a27fd20a767d00de.png”],“collectCount”:0}],“total”:2557}}

在这里插入图片描述

{"code": 200,"message": "success","traceId": "47d3f9ad-bfc0-4604-b386-48b0e0b40c8d","data": {"list": [{"articleId": 132295415,"title": "shellcheck警告:Declare and assign separately to avoid masking return values.shellcheck(SC2155)","description": "ShellCheck的SC2155警告是关于在shell脚本中正确处理命令返回值的一个重要提示。通过将声明和赋值分开进行,我们可以确保命令的返回值不会被误导,并且在命令执行失败时,脚本能够正确地捕获并处理错误。","url": "https://dontla.blog.csdn.net/article/details/132295415","type": 1,"top": false,"forcePlan": false,"viewCount": 8,"commentCount": 0,"editUrl": "https://editor.csdn.net/md?articleId=132295415","postTime": "2023-08-15 13:16:23","diggCount": 0,"formatTime": "8 小时前","picList": ["https://img-blog.csdnimg.cn/a0eb894421994488a27fd20a767d00de.png"],"collectCount": 0}],"total": 2557}
}

目前已知的是:原创对应type值为1,转载对应为2。

json字段解读

这是一个JSON格式的HTTP响应,用于传输具体的数据信息。以下是对每个字段的解读:

  • code: 这是HTTP响应状态码,200通常表示请求成功。

  • message: 这是响应的描述信息,"success"表示请求处理成功。

  • traceId: 这可能是此次请求的唯一标识符,用于追踪和调试。

  • data: 这是实际返回的数据对象,包含以下字段:

    • list: 这是一个数组,包含请求的业务列表。由于在请求中指定了size=1,所以此处只有一个对象。该对象包含以下属性:
      • articleId: 文章的唯一标识符。
      • title: 文章的标题。
      • description: 文章的描述。
      • url: 文章的网址链接。
      • type: 文章的类型,具体代表什么需要参考API文档或者询问API提供者。
      • top: 是否置顶,false表示未置顶。
      • forcePlan: 不清楚这个字段的具体含义,可能需要参考API文档或者询问API提供者。
      • viewCount: 文章的浏览次数。
      • commentCount: 文章的评论数量。
      • editUrl: 编辑文章的链接。
      • postTime: 文章的发布时间。
      • diggCount: 文章的点赞数。
      • formatTime: 格式化后的发布时间。
      • picList: 文章中的图片列表。
      • collectCount: 文章的收藏数量。
    • total: 在满足请求条件(如用户名、业务类型等)的情况下,总的记录数量。

综上,这个JSON响应表示成功获取了用户"Dontla"的博客文章列表(因为设置了size=1,所以只返回了一个结果)。该用户共有2557篇博客文章,最新的一篇文章的标题、描述、链接、类型、浏览次数、评论数量、编辑链接、发布时间、点赞数、图片列表和收藏数量都在响应中给出。

点赞为什么是digg?
digg"这个词在网络社区中经常被用来表示“点赞”或者“投票”。这个词的来源是一家名为Digg的美国新闻网站,用户可以对他们喜欢的文章进行“digg”,也就是投票,最受欢迎的文章会被推送到首页。因此,"digg"在很多网站和应用中都被用作代表用户点赞或者投票的动作。

Apipost测试接口

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

在这里插入图片描述

(Apipost接口元数据)

{"parent_id": "0","project_id": "-1","target_id": "fdb84824-e558-48f1-9456-219ea5e9950e","target_type": "api","name": "新建接口","sort": 1,"version": 0,"mark": "developing","create_dtime": 1692028800,"update_dtime": 1692109242,"update_day": 1692028800000,"status": 1,"modifier_id": "-1","method": "GET","mock": "{}","mock_url": "/community/home-api/v1/get-business-list","url": "https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=Dontla","request": {"url": "https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=Dontla","description": "","auth": {"type": "noauth","kv": {"key": "","value": ""},"bearer": {"key": ""},"basic": {"username": "","password": ""},"digest": {"username": "","password": "","realm": "","nonce": "","algorithm": "","qop": "","nc": "","cnonce": "","opaque": ""},"hawk": {"authId": "","authKey": "","algorithm": "","user": "","nonce": "","extraData": "","app": "","delegation": "","timestamp": "","includePayloadHash": -1},"awsv4": {"accessKey": "","secretKey": "","region": "","service": "","sessionToken": "","addAuthDataToQuery": -1},"ntlm": {"username": "","password": "","domain": "","workstation": "","disableRetryRequest": 1},"edgegrid": {"accessToken": "","clientToken": "","clientSecret": "","nonce": "","timestamp": "","baseURi": "","headersToSign": ""},"oauth1": {"consumerKey": "","consumerSecret": "","signatureMethod": "","addEmptyParamsToSign": -1,"includeBodyHash": -1,"addParamsToHeader": -1,"realm": "","version": "1.0","nonce": "","timestamp": "","verifier": "","callback": "","tokenSecret": "","token": ""}},"body": {"mode": "none","parameter": [],"raw": "","raw_para": [],"raw_schema": {"type": "object"}},"event": {"pre_script": "","test": ""},"header": {"parameter": []},"query": {"parameter": [{"description": "","is_checked": 1,"key": "page","type": "Text","not_null": 1,"field_type": "String","value": "1"},{"description": "","is_checked": 1,"key": "size","type": "Text","not_null": 1,"field_type": "String","value": "20"},{"description": "","is_checked": 1,"key": "businessType","type": "Text","not_null": 1,"field_type": "String","value": "blog"},{"description": "","is_checked": 1,"key": "orderby","type": "Text","not_null": 1,"field_type": "String","value": ""},{"description": "","is_checked": 1,"key": "noMore","type": "Text","not_null": 1,"field_type": "String","value": "false"},{"description": "","is_checked": 1,"key": "year","type": "Text","not_null": 1,"field_type": "String","value": ""},{"description": "","is_checked": 1,"key": "month","type": "Text","not_null": 1,"field_type": "String","value": ""},{"description": "","is_checked": 1,"key": "username","type": "Text","not_null": 1,"field_type": "String","value": "Dontla"}]},"cookie": {"parameter": []},"resful": {"parameter": []}},"response": {"success": {"raw": "","parameter": [],"expect": {"name": "成功","isDefault": 1,"code": 200,"contentType": "json","verifyType": "schema","mock": "","schema": {}}},"error": {"raw": "","parameter": [],"expect": {"name": "失败","isDefault": -1,"code": 404,"contentType": "json","verifyType": "schema","mock": "","schema": {}}}},"is_first_match": 1,"ai_expect": {"list": [],"none_math_expect_id": "error"},"enable_ai_expect": -1,"enable_server_mock": -1,"is_example": -1,"is_locked": -1,"is_check_result": 1,"check_result_expectId": "","is_changed": -1,"is_saved": -1
}

编写python代码(注意有反爬虫策略,需要设置请求头)(成功)

网站反爬虫策略:一些网站会通过识别请求头(User-Agent)来判断是否为机器人行为。解决方法是添加合适的请求头:

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"
}
response = requests.get(url, headers=headers)

完整代码:

import requests
import json# 定义变量存储所有文章信息
articles = []# 设置初始分页
page = 1# 设置每页查询数量
page_size = 50while True:# 构建请求urlurl = f"https://blog.csdn.net/community/home-api/v1/get-business-list?page={page}&size={page_size}&businessType=blog&orderby=&noMore=false&year=&month=&username=Dontla"# 发送GET请求# response = requests.get(url)# 防止反爬虫策略headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"}response = requests.get(url, headers=headers)# 如果请求成功if response.status_code == 200:# print(f'response.content: {response.content}')# print(f'response.text: {response.text}')# 检查响应是否为空if response.text:# 解析JSON响应try:data = response.json()except json.JSONDecodeError:print(f"Error parsing JSON: {response.text}")break# 遍历每个文章for article in data['data']['list']:print(f"page: {page}, {article['url']}")# 获取并保存需要的信息articles.append({'title': article['title'],'url': article['url'],'type': article['type'],'postTime': article['postTime']})# 判断是否还有更多文章,如果没有则结束循环if len(data['data']['list']) < page_size:break# 增加分页数以获取下一页的文章page += 1else:print("Response is empty")breakelse:print(f"Error: {response.status_code}")break# 将结果保存为json文件
with open('articles.json', 'w') as f:json.dump(articles, f, ensure_ascii = False, indent = 4)

注意,最大单次查询上限为100,我一开始把每页查询数量page_size设置成200,发现不行,后来设置成100以下就ok了,为了保证速度,我就设置成100:

这是代码运行结果:

在这里插入图片描述

这是生成的j’son文件:

在这里插入图片描述

总共2557个元素,跟我的博文数量相符:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

03_缓存双写一致性

03——缓存双写一致性 一、缓存双写一致性 如果redis中有数据&#xff0c;需要和数据库中的值相同如果redis中无数据&#xff0c;数据库中的值要是最新值&#xff0c;且准备回写redis 缓存按照操作来分&#xff0c;可以分为两种&#xff1a; 只读缓存 读写缓存 同步直写操作…

【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发&#xff0c;需要用到集列表&#xff0c;也就是SetList这个控件&#xff0c;然而网上相关的资料和范例实在是太少&#xff0c;有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG&#xff08;NX&#xff09;二次开发 BlockUI 集列表使用方法》&#xff0…

K8S deployment挂载

Deployment部署文件 apiVersion: apps/v1 kind: Deployment metadata:annotations:deployment.kubernetes.io/revision: "1"kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"apps/v1","kind":"Deployment&qu…

Redis从基础到进阶篇(一)

目录 一、了解NoSql 1.1 什么是Nosql 1.2 为什么要使用NoSql 1.3 NoSql数据库的优势 1.4 常见的NoSql产品 1.5 各产品的区别 二、Redis介绍 2.1什么是Redis 2.2 Redis优势 2.3 Redis应用场景 2.4 Redis下载 三、Linux下安装Redis 3.1 环境准备 3.2 Redis的…

JDK8知识点梳理

JDK8知识点梳理 一、lambda表达式1.标准格式2.实现原理3.省略模式4.前提条件 二、函数式接口1.函数式接口&#xff1a;FunctionalInterface2.接口默认方法3.接口静态方法4.供给型接口&#xff1a;Supplier5.消费型接口&#xff1a;Consumer6.消费供给型接口&#xff1a;Functio…

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析

孤注一掷——基于文心Ernie-3.0大模型的影评情感分析 文章目录 孤注一掷——基于文心Ernie-3.0大模型的影评情感分析写在前面一、数据直观可视化1.1 各评价所占人数1.2 词云可视化 二、数据处理2.1 清洗数据2.2 划分数据集2.3 加载数据2.4 展示数据 三、RNIE 3.0文心大模型3.1 …

stm32单片机开关输入控制蜂鸣器参考代码(附PROTEUS电路图)

说明&#xff1a;这个buzzer的额定电压需要改为3V&#xff0c;否则不会叫&#xff0c;源代码几乎是完全一样的 //gpio.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file gpio.c* brief Thi…

linkis 1.1.1 报错 No plugin found spark-2.4.8, please check your configuration

按照官方教程设置,但是仍然报错 Caused by: java.util.concurrent.ExecutionException: LinkisException{errCode70063, descNo plugin found spark-2.4.8, please check your configuration, iphadoop0004, port9103, serviceKindlinkis-cg-engineplugin} 这个时候,我们首先检…

excel逻辑函数篇1

1、AND(logical1,[logical2],…)&#xff1a;用于测试所有条件是否均为TRUE 检查所有参数均为true&#xff0c;如果是则返回true 2、OR(logical1,[logical2],…)&#xff1a;用于测试是否有为TRUE的条件 如果任意参数值为true&#xff0c;即返回true&#xff1b;只有当所有参数…

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云 serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版&#xff0c;是全Serverless架构的云原生数据库 前言 体验了一下腾讯云刚出的TDSQL-C Serverless&#xff0c;使用…

【idea】社区版idea运行Tomcat

使用 Smart Tomcat插件 配置运行&#xff1a;

通过LD_PRELOAD绕过disable_functions

LD_PRELOAD LD_PRELOAD是Linux/Unix系统的一个环境变量&#xff0c;它可以影响程序的运行时的链接&#xff0c;它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量&#xff0c;可以在主程序和其动态链接库的中间加载别的动态链接库&#xff0c;甚至覆盖系统的函数…

【NOIP】标题统计

author&#xff1a;&Carlton tags&#xff1a;模拟&#xff0c;字符串 topic&#xff1a;【NOIP】标题统计 language&#xff1a;C website&#xff1a;P5015 [NOIP2018 普及组] 标题统计 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) date&#xff1a;2023年8月20日…

Rust语法:所有权引用生命周期

文章目录 所有权垃圾回收管理内存手动管理内存Rust的所有权所有权转移函数所有权传递 引用与借用可变与不可变引用 生命周期悬垂引用函数生命周期声明结构体的生命周期声明Rust生命周期的自行推断生命周期约束静态生命周期 所有权 垃圾回收管理内存 Python&#xff0c;Java这…

Cesium加载ArcGIS Server4490且orgin -400 400的切片服务

Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时&#xff0c;默认只支持wgs84的4326坐标系&#xff0c;不支持CGCS2000的4490坐标系。 如果是ArcGIS发布的4490坐标系的切片服务&#xff0c;如果原点在orgin X: -180.0Y: 90.0的情况下&#xff0c;我们可…

【最新可用】VMware中ubuntu与主机window之间使用共享文件夹传输大文件

一、VMware设置共享文件夹 &#xff08;1&#xff09;虚拟机关机情况下&#xff0c;创建一个共享文件夹 &#xff08;2&#xff09;ubuntu中挂载共享文件夹 1、如果之前已经挂载 hgfs&#xff0c;先取消挂载 sudo umount /mnt/hgfs2、重新使用以下命令挂载 sudo /usr/bin/vmh…

CompletableFuture总结和实践

CompletableFuture被设计在Java中进行异步编程。异步编程意味着在主线程之外创建一个独立的线程&#xff0c;与主线程分隔开&#xff0c;并在上面运行一个非阻塞的任务&#xff0c;然后通知主线程进展&#xff0c;成功或者失败。 一、概述 1.CompletableFuture和Future的区别&…

Cesium之水流模型

关于Primitive。 Primitive和Entity&#xff0c;一般翻译成图元和实体&#xff0c;图元更接近底层&#xff0c;实体是封装后的高级对象&#xff0c;使用更加简便。一般来说&#xff0c;Primitive的使用相对繁琐&#xff0c;相比Entity需要使用者自己初始化更多对象&#xff0c…

day9 STM32 I2C总线通信

I2C总线简介 I2C总线介绍 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线&#xff08;也称IIC或I2C&#xff09;是由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。 它是同步通…

【Android】相对布局(RelativeLayout)最全解析

【Android】相对布局&#xff08;RelativeLayout&#xff09;最全解析 一、相对布局&#xff08;RelativeLayout&#xff09;概述二、根据父容器定位三、根据兄弟控件定位 一、相对布局&#xff08;RelativeLayout&#xff09;概述 相对布局&#xff08;RelativeLayout&#x…