Python爬虫分析CSDN个人博客数据

2023-11-19

前言:到周末了,产生一个idea,就是获取个人的全部博客标题及链接,发布时间、浏览量、以及收藏量等数据信息,按访问量排序,整理成一份Excel表存储。
使用时,输入个人博客ID即可,从数据获取到解析存储,用到requests、BeautifulSoup、pandas等三方库,一个完整的Python爬虫实践。

知识点

网页分析

博客列表分析

博客列表
通过分析我的博客列表网页代码,提取出每篇文章的链接。
我的博客列表url为:https://blog.csdn.net/xiaoma_2018/article/list/1?t=1
注意每个人的博客ID会不同,因此本爬虫使用时要求输入个人的博客ID及页码数,以达到通用的功能。

单篇博客分析

单篇博客
通过分析单篇博客的网页源码,从其中获取文章链接、文章标题、发布时间、浏览量、以及收藏量等数据信息。

环境配置

本爬虫程序,运行环境说明 PyCharm 2020.1.1、Python 3.7.5
使用到的第三方依赖库如下:
执行:pip freeze > requirements.txt 导出

beautifulsoup4==4.9.1
pandas==1.1.1
requests==2.24.0

代码实现

代码主要思路是:

  1. 要求输入博客ID和页面数
  2. 爬取全部博客链接
  3. 爬取每一篇博客的数据信息
  4. 数据存储

config 配置

为了方便爬取不同的博客ID网页,单独写了入一个配置文件来定义爬虫用到的参数及文件路径参数,config.py 文件如下:

'''
@Author Caso_卡索
@Date 2020-8-30 15:00
@Func 爬虫程序用到的请求头信息及文件路径信息
@File config.py
'''
Host = "blog.csdn.net" # 请求头host参数
User_Agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
Source = 'html.txt'   # 临时保存博客列表html源码
EachSource = 'each.txt' # 临时保存每篇博客html源码
OUTPUT = "博客信息.csv"  # 输出博客信息到 csv 文件

其中,User_Agent必须根据自己的浏览器参数配置才能使用,其他参数可默认该配置。

run 代码

'''
@Author Caso_卡索
@Date 2020-8-25 22:14
@Func Python爬虫CSDN博客文章数据,并写入excel表中
      使用 re 模块正则匹配要获取的 url地址
'''
import requests
from bs4 import BeautifulSoup
import pandas as pd
import os
import re
from config import Host, User_Agent, Source, EachSource,OUTPUT

results = [] # 存储全部数据

def parseEachBlog(link):
    referer = "Referer: " + link
    headers = {"Referer": referer, "User-Agent": User_Agent}
    r = requests.post(link, headers=headers)
    html = r.text
    with open(EachSource, 'w', encoding='UTF-8') as f:
        f.write(html)
    soup = BeautifulSoup(open(EachSource, 'r', encoding='UTF-8'), features="html.parser")
    readcontent = soup.select('.bar-content .read-count')
    collection = soup.select('.bar-content .get-collection')
    readcounts = re.sub(r'\D', "", str(readcontent[0]))
    collections = re.sub(r'\D', "", str(collection[0]))
    blogname = soup.select('.title-article')[0].text
    time = soup.select('.bar-content .time')[0].text
    eachBlog = [blogname, link, readcounts, collections, time]
    return eachBlog

def getBlogList(blogID, pages):
    listhome = "https://" + Host + "/" + blogID + "/article/list/"
    pagenums = [] # 转换后的pages页数
    for i in range(1, int(pages)+1):
        pagenums.append(str(i))

    for number in pagenums:
        url = listhome + number + "?t=1"
        headers = {"Referer": url, "Host": Host, "User-Agent": User_Agent}
        response = requests.post(url, headers=headers)
        html = response.text
        with open(Source, 'a', encoding='UTF-8') as f:
            f.write(html)
    # 获取全部博客的链接
    soup = BeautifulSoup(open(Source, 'r', encoding='UTF-8'), features="html.parser")
    hrefs = []
    re_patterm = "^https://blog.csdn.net/" + blogID + "/article/details/\d+$"
    for a in soup.find_all('a', href=True):
        if a.get_text(strip=True):
            href = a['href']
            if re.match(re_patterm, href):
                if hrefs.count(href) == 0:
                    hrefs.append(href)
    return hrefs

def parseData():
    results.sort(key=lambda result:int(result[2]), reverse=True) # 按浏览量排序
    dataframe = pd.DataFrame(data=results)
    dataframe.columns = ['文章标题', '文章链接', '浏览量', '收藏量', '发布时间']
    dataframe.to_csv(OUTPUT, index=False, sep=',')

def delTempFile():
    if os.path.exists(Source):
        os.remove(Source)
    if os.path.exists(EachSource):
        os.remove(EachSource)

if __name__ == '__main__':
    blogID = input("输入你要爬去的博客名: ")
    pages = input("输入博客列表页数: ")
    print("获取全部博客链接...")
    linklist = getBlogList(blogID, pages)
    print("开始获取数据...")
    for i in linklist:
        print("当前获取: %s"%(i))
        results.append(parseEachBlog(i))
    print("结束获取数据...")
    # 开始解析并存储 .csv 文件
    print("开始解析并存储数据...")
    parseData()
    print("删除临时文件...")
    delTempFile()

执行过程

以我自己的博客ID为例,来展示一下执行的过程及结果,我的博客列表目前两页。
开始执行
开始
结束执行
结束
结果显示
结果

代码下载

从想法到实现,再到输出这篇博文结束,还是挺好玩,在此总结分享。
完整的爬虫代码上传到了本人Github上,地址如下:ParseCSDNBlog


作者: Caso_卡索
博客: https://blog.csdn.net/xiaoma_2018
版权声明:未经允许,禁止转载

喜欢的朋友点赞支持一下,在此感谢…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫分析CSDN个人博客数据 的相关文章

  • 为什么 pandas 在简单的数学运算上比 numpy 更快?

    最近 我观察到 pandas 的乘法速度更快 我在下面的例子中向您展示了这一点 如此简单的操作怎么可能做到这一点 这怎么可能呢 pandas 数据帧中的底层数据容器是 numpy 数组 测量 我使用形状为 10k 10k 的数组 数据框 i
  • 如何在 QTableView 标题中单击鼠标右键单击上下文菜单?

    下面的示例代码 很大程度上受到here http www saltycrane com blog 2007 12 pyqt 43 qtableview qabstracttablemodel 有一个右键单击上下文菜单 当用户单击表中的单元格
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • 绝对导入不起作用,但相对导入起作用

    这是我的应用程序结构 foodo setup py foodo init py foodo py models py foodo foodo foodo py从导入类models py module from foodo models im
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • dask apply:AttributeError:“DataFrame”对象没有属性“name”

    我有一个参数数据框 并对每一行应用一个函数 该函数本质上是几个 sql queries 和对结果的简单计算 我正在尝试利用 Dask 的多处理 同时保持结构和界面 下面的例子有效并且确实有显着的提升 def get metrics row
  • Pandas如何按时间段过滤DataFrame

    我有一个包含下表的文件 Name AvailableDate totalRemaining 0 X3321 2018 03 14 13 00 00 200 1 X3321 2018 03 14 14 00 00 200 2 X3321 20
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • 一个类似 dict 的 Python 类

    我想编写一个自定义类 其行为类似于dict 所以 我继承自dict 不过 我的问题是 我是否需要创建一个私有的dict我的成员 init 方法 我不明白这个有什么意义 因为我已经有了dict如果我只是继承自的行为dict 谁能指出为什么大多
  • Python:“直接”调用方法是否实例化对象?

    我是 Python 新手 在对我的对象进行单元测试时 我注意到一些 奇怪 的东西 class Ape object def init self print ooook def say self s print s def main Ape
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • 错误:尝试使用 scrappy 登录时出现 raise ValueError("No element found in %s" % response)

    问题描述 我想从我大学的bbs上抓取一些信息 这是地址 http bbs byr cn http bbs byr cn下面是我的蜘蛛的代码 from lxml import etree import scrapy try from scra
  • python中将对象数据类型转换为字符串问题

    如何将对象数据类型结构转换为字符串数据类型 下面的方法不起作用 该列仍然存在object转换为字符串后 astype import pandas as pd df pd DataFrame country A B C D E df dtyp
  • 在 for 循环中访问 itertools 产品的元素

    我有一个列表列表 是附加 itertools 产品的一些其他结果的结果 我想要的是能够使用 for 循环访问列表列表中列表的每个元素 但我无法访问所有元素 我只能访问最后一个列表的元素 结果是一个非常巨大的列表列表 例如 1 2 4 3 6
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何使用logging.conf文件使用RotatingFileHandler将所有内容记录到文件中?

    我正在尝试使用RotatingHandler用于 Python 中的日志记录目的 我将备份文件保留为 500 个 这意味着我猜它将创建最多 500 个文件 并且我设置的大小是 2000 字节 不确定建议的大小限制是多少 如果我运行下面的代码
  • Python matplotlib:将轴标签/图例从粗体更改为常规粗细

    我正在尝试制作一些出版质量的图 但遇到了一个小问题 默认情况下 matplotlib 轴标签和图例条目的权重似乎比轴刻度线重 是否有办法强制轴标签 图例条目与刻度线的重量相同 import matplotlib pyplot as plt
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d

随机推荐

  • DCMTK读取DICOM文件头信息的三种方法

    Howto Load File Meta Header Here s an example that shows how to load the File Meta Information Header of a DICOMfile wit
  • 2020年pubg服务器维护时间,7月25日pubg维护一般多久 绝地求生正式服稳定更新

    2018年7月25日 绝地求生正式服进行了官方维护 时间大约持续3小时 主要维护内容是提高客户端稳定性 维护结束后 玩家需重新启动steam客户端获取更新 自定义服务器匹配 为了让每位玩家可以创建自己的游戏房间 我们以不限号测试的方式开放了
  • 关于使用NodeJS+Express搭建服务器访问静态资源的一些填坑经验

    前言 NodeJs是一个能让前端开发工程师变成全栈工程师的神器 最近在搞一个私活 需要上传图片到服务器存储 按照以前的想法 是用Java写代码搭服务器 奈何 大学毕业后就一直在搞前端和安卓开发 Java写服务端的技术已经忘得差不多了 好在J
  • leetcode动态规划总结之01背包和完全背包问题

    1 背包问题分类 其中 除了01背包和完全背包外 leetcode题目中好像还没有涉及其他类型的背包 在这里我就不做总结 2 01背包理论 有N件物品和一个最大承载重量为W 的背包 第i件物品的重量是weight i 其价值是value i
  • 树莓派4b 开启热点,设置自身ip与手机vnc连接

    此方法开启的热点 无法访问网络 1 下载现成的工具 git clone https github com oblique create ap git 如果无法访问github 这里下载 2 编译 cd create ap sudo make
  • 原码,反码,补码,阶码,移码

    本文转载自本站大佬 不去上课 原文链接https blog csdn net ruidianbaihuo article details 87875178 原码 反码 补码 阶码 移码是什么 有什么区别 讨论机器数的表示 本文内容参考自王达
  • osgEarth的Rex引擎原理分析(二)osg是如何根据文件扩展名寻找需要加载的动态链接库插件的

    在 一 中有createLibraryNameForFile 它会根据文件扩展名构造需要加载的动态链接库 osgDB Registry cpp ReaderWriter ReadResult Registry read const Read
  • JVM远程调试功能开启,与原理

    前言 以前有篇文章 讲解Tomcat开启远程调试功能 只是讲解了用法 以及Tomcat的作者书写脚本的初衷 原理没写 其实不是Tomcat的具有远程调试功能 是JVM虚拟机提供的能力 Java应用都能开启远程调试能力 上一篇文章 tomca
  • 程序“catkin_init_workspace”尚未安装。 您可以使用以下命令安装: sudo apt install catkin

    程序 catkin init workspace 尚未安装 您可以使用以下命令安装 sudo apt install catkin 问题如图 先贴上解决后的效果 运行环境 ubuntu 16 04 ros版本 kinetic 问题解释 这个
  • MATLAB上使用FasterRcnn实现目标(温湿度计)检测

    本文硬件环境是 win7 64位 MATLAB R2018a 由于第一次接触目标检测 很多东西只是照猫画虎 不甚了解 将自己成功的测试流程记录如下 方便和自己有同样需求的人拿来就用 减少学习过程中的不必要的困难 主要参照资料1和4中的方法
  • TCP连接阻塞的监控和处理

    TCP连接阻塞的监控和处理 那么 什么样的TCP连接属于上述发生阻塞的异常连接呢 结合线上运维经验 我们整理出符合该类异常的特征如下 该连接的Recv Q的值特别大 超过3M 该连接的Recv Q的值持续上涨 造成堆积 在一定滑动时间窗口内
  • 一、MM Segmentation 介绍与安装

    时间 2022年4月1日 内容 学习MM Segmentation MM Segmentation 介绍和理解 MM Segmentation 利用注册器和配置文件 实现了 可拓展性 和 易用性 它是一个封装了许多语义分割深度神经网络的框架
  • solidity经典案例----智能小游戏

    参考于https ke qq com webcourse 2379017 103111126 taid 10365401060101385 vid 5285890802017890711 1 案例功能介绍 平台方部署智能合约 用户选择下大或
  • pytorch.onnx.export方法参数详解,以及onnxruntime-gpu推理性能测试

    Torch onnx export执行流程 1 如果输入到torch onnx export的模型是nn Module类型 则默认会将模型使用torch jit trace转换为ScriptModule 2 使用args参数和torch j
  • C++ 拷贝构造函数的用法

    当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候 拷贝构造函数就会被自动调用 也就是说 当类的对象需要拷贝时 拷贝构造函数将会被调用 以下情况都会调用拷贝构造函数 一个对象以值传递的方式传入函数体 一个对象以值传递的方
  • 服务器命令使用

    服务器命令使用 一 常用命令 二 实际经常使用的命令 1 ls 列出目录内容 2 unzip 7z x 解压文件夹命令 一级目录 一级目录 一级目录 一 常用命令 ls 列出目录内容 cd 切换目录 pwd 显示当前工作目录的路径 mkdi
  • Nginx反向代理(负载均衡)和作为web服务器的使用

    一 安装启动Nginx 1 官网下载 URL http nginx org en download html 解压后如下 2 启动nginx有很多种方法启动nginx 1 直接双击nginx exe 双击后一个黑色的弹窗一闪而过 或者点击右
  • 我怎样一步一步引导ChatGPT写完一篇本科毕业论文

    先了解毕业论文相关专家 给ChatGPT指定一个角色 我给ChatGPT指定一个学术导师角色 好家伙 给我谦虚起来了 好 换个方式 他开始听话了 了解论文格式 计算机科学与技术专业论文一般有哪些部分组成 选题 了解方向 请先告诉我计算机科学
  • VUE-CLI学习第七天

    VUE CLI学习第七天 vue vuex学习 vuex结构 引入vuex vuex的使用 state mutation action modules getters 对象解构 vuex模块封装 vue vuex学习 vuex结构 src
  • Python爬虫分析CSDN个人博客数据

    前言 到周末了 产生一个idea 就是获取个人的全部博客标题及链接 发布时间 浏览量 以及收藏量等数据信息 按访问量排序 整理成一份Excel表存储 使用时 输入个人博客ID即可 从数据获取到解析存储 用到requests Beautifu