【Python爬虫】CSDN热榜文章热门词汇分析

news2024/11/16 7:49:50

📚 前言

在信息时代,我们经常需要从大量的文章中获取有用的信息。本文将介绍如何使用Python进行数据处理,获取热榜文章的标题和标签,并使用jieba库进行数据分析。通过本文的学习,你将掌握获取和分析热榜文章数据的技巧。

先上看看效果:

在这里插入图片描述
词云_标签

🛠️ 环境准备

在开始编写代码之前,我们需要进行一些环境准备。以下是所需的环境和库:

  • 操作系统:Windows
  • 编程语言:Python 3
  • 编辑器:VSCode(可选)

所使用的库

库名作用
requests发送HTTP请求获取网页内容
BeautifulSoup处理和分析数据
jieba中文分词工具
wordcloud制作词云图
matplotlib绘制图表
csvcsv表格处理
jsonjson格式

可以使用以下命令需要安装的库:

pip install BeautifulSoup
pip install jieba
pip install wordcloud
pip install matplotlib

请确保已经正确安装了Python 3,并且在编写代码之前设置了Python 3的环境变量。

📑 热榜信息获取

🎯热榜上的信息获取

首先,我们需要从全站综合热榜上获取热门文章的信息。

全站综合热榜https://blog.csdn.net/rank/list

在这里插入图片描述

需要的文章信息有

["标题", "标签","作者","评论数" ,"收藏量","浏览量", "热度值", "文章链接"]

经分析,全站综合热榜文章信息数据可以在hot-rank 的api中获取到除文章标签外的信息:

在这里插入图片描述

在这里插入图片描述

代码如下:

def get_hot_list(page):
    # 每页25条信息,总共4页,100条
    params = {
        "page": page,     # 页数
        "pageSize": "25",
        "type": ""
    }
    hot_rank_url = 'https://blog.csdn.net/phoenix/web/blog/hot-rank'
    data = requests.get(url=hot_rank_url,headers=user_headers,params=params)
    hot_rank_list = data.json()["data"]
    for article in hot_rank_list:
        Url = article["articleDetailUrl"]  # 获取文章链接
        tag_list = get_article_tag(Url,user_headers) # 文章标签,列表形式  
        tag = ",".join(tag_list) #列表转为字符串,使用“,”连接
        Title = article["articleTitle"]  # 获取文章标题
        commentCount = article["commentCount"]  # 评论
        favorCount = article["favorCount"]  # 收藏
        hotRankScore = article["hotRankScore"]  # 热度
        nickName = article["nickName"]      # 作者
        viewCount = article["viewCount"]    # 浏览量

上述代码中,我们使用requests库发送HTTP请求获取热榜xhr数据。然后,使用json方法处理数据,提取其中的表格数据。

🎯补充信息(文章标签)

文章标签需要访问文章详情页才能够拿到,所在位置如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mkPdg0JP-1689416684853)(C:\Users\LIN\AppData\Roaming\Typora\typora-user-images\image-20230715163532878.png)]

检查文章源代码,使用搜索可以找到,文章标签在body->script下

在这里插入图片描述

找到位置了,💪那就开始写代码…

def get_article_tag(articleDetailUrl,user_headers):
    """
    articleDetailUrl : 文章链接
    """
    data = requests.get(url=articleDetailUrl,headers=user_headers)
    # 使用html.parser解析响应文档
    soup = BeautifulSoup(data.text, 'html.parser')
    # 获取所有script对象内容
    script_tag = soup.find('script', text=re.compile('toolbarSearchExt')).text.strip()
    # 提取特定var变量的值  
    result = json.loads(script_tag[script_tag.find('{'):script_tag.find('}')+1])  
    return result["tag"]

🗐 信息保存

获取热榜文章信息后,我们可以将其保存到CSV文件中,并将标题和标签分别保存到文本文件中,为后面的jieba分析作准备。

def get_hot_list(page):
    ...
    # 将信息存入对应的列表
    hot_data_list.append([Title,tag,nickName,commentCount,favorCount,viewCount,hotRankScore,Url])
    hot_title_list.append(Title)
    hot_tag_list.extend(tag_list) 

if __name__ == "__main__":
    hot_data_list = [] 	# 热榜文章信息列表
    hot_title_list = []	# 热榜文章标题列表
    hot_tag_list = []	# 热榜文章标签列表
    for i in range(4):
        get_hot_list(i)
    with open(r"..\file\csdn热榜分析.csv", "w", newline="", encoding="utf-8-sig") as file:
        writer = csv.writer(file)
        writer.writerow(["标题", "标签","作者","评论数" ,"收藏量","浏览量", "热度值", "文章链接"])
        writer.writerows(hot_data_list)
    with open(r"..\file\csdn热榜标签.txt", "w", newline="", encoding="utf-8") as f_tag:
        f_tag.writelines(hot_tag_list)
    with open(r"..\file\csdn热榜标题.txt", "w", newline="", encoding="utf-8") as f_title:
        f_title.writelines(hot_title_list)

上述代码使用for循环获取全部文章信息,其中i表示页数。

使用sys库获取当前py文件所在的目录,以防代码在不同电脑上运行,路径不同存储读取出现问题

if __name__ == "__main__":
    ...
    # 当前py文件所在的目录
	bath_path = sys.path[0]
    with open(f"{bath_path}\\file\csdn热榜分析.csv", "w", newline="", encoding="utf-8-sig") as file:
        writer = csv.writer(file)
        writer.writerow(["标题", "标签","作者","评论数" ,"收藏量","浏览量", "热度值", "文章链接"])
        writer.writerows(hot_data_list)
    ...

在这里插入图片描述

🌐 分词

Jieba是一个流行的中文分词库,它能够将中文文本切分成词语,并对每个词语进行词性标注。中文分词是自然语言处理的重要步骤之一,它对于文本挖掘、信息检索、情感分析等任务具有重要意义。

接下来,我们将使用jieba库对标题和标签进行分词处理,以便后续的数据分析。

import jieba

# 读取标题和标签文本
with open('csdn热榜标签.txt', 'r') as file:
    titles = file.readlines()

with open('csdn热榜标签.txt', 'r') as file:
    tags = file.readlines()

# 分词处理
title_words = [jieba.lcut(title.strip()) for title in titles]
tag_words = [jieba.lcut(tag.strip()) for tag in tags]

# 查看分词结果
print(title_words[:5])
print(tag_words[:5])

在上述代码中,我们使用jieba库对标题和标签进行分词处理。首先,我们使用jieba.lcut()函数对每个标题和标签进行分词,并将结果存储在列表中。分词结果是一个列表的列表,每个子列表表示一个标题或标签的分词结果。

在这里插入图片描述

📊 柱形图

📊 分词统计

构造字典,逐一遍历分词结果中的中文单词进行处理,并用字典计数,然后转为列表进行排序(代码为标题部分示例)。

counts = {}  # 构造字典,计数
for title_word in title_words:
    for word in title_word:
        if len(word) == 1:
            continue
        else:
            counts[word] = counts.get(word, 0) + 1
items = list(counts.items())  # 转换,排序
items.sort(key=lambda x: x[1], reverse=True)

📊 绘制柱形图

使用pyplot库对标题和标签分词数据进行可视化,这里截取前20的热词。(代码为标题部分示例)

from matplotlib import pyplot as plt
newitems = items[0:20:1] # 截取前20
tu = dict(newitems)
# 定义 x和 y的空列表,用于分别存放tu字典的键和值
x = []
y = []
# 列车键和分别追加到x和y列表
for k in tu:
    x.append(k)
    y.append(tu[k])

plt.title("csdn热榜标签词汇统计", fontsize=25)# 打印标题
plt.xlabel("热门词汇")			   # x标签
plt.ylabel("词频")				# y标签
plt.xticks(rotation=45, fontsize=10)
# 输出图表中间的文字各种格式的定义
for a, b in zip(x, y):
    plt.text(a, b, "%.0f" % b, ha="center", va="bottom", fontsize=12, )

plt.bar(x, y, label="频率") # 图示
plt.legend()
plt.show()# 图表展示

运行结果:

在这里插入图片描述

🤔中文显示出现问题,解决办法如下:

# 支持中文
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 用来正常显示中文标签

运行结果:

在这里插入图片描述

柱形图完成o( ̄▽ ̄)ブ

☁︎ 制作词云

词云是一种可视化工具,可以直观地显示文本数据中词语的重要程度。下面我们使用wordcloud库制作标题和标签的词云图。

# 分词处理
title_words = [jieba.lcut(title.strip()) for title in titles][0]
tag_words = [jieba.lcut(tag.strip()) for tag in tags][0]

title_words_str = ' '.join(title_words) # 连接成字符串
tag_words_str = ' '.join(tag_words) # 连接成字符串

stopwords = ["[", "]", "【", "】",'(',')', '(', ')', '|', '/', ] # 去掉不需要显示的词
words_img = wordcloud.WordCloud(font_path="msyh.ttc",
                         width = 1000,
                         height = 700,
                         background_color='white',
                         max_words=100,stopwords=stopwords)

# msyh.ttc电脑本地字体,写可以写成绝对路径
words_img.generate(title_words_str) 	  # 加载标题词云文本
words_img.to_file(r"..\file\标题词云.png") # 保存词云文件

words_img.generate(tag_words_str)		  # 加载标签词云文本
words_img.to_file(r"..\file\标签词云.png") # 保存词云文件

在上述代码中,我们首先将分词结果转换为一个字符串,以便传递给WordCloud类。然后,使用WordCloud类制作标题和标签的词云图。

词云_标题 词云_标签

📑 结论

通过本文的学习,我们掌握了使用Python获取热榜文章标题和标签的方法,并使用jieba库进行数据分析。我们学习了如何保存数据到CSV文件和文本文件中,如何使用jieba库进行分词处理,以及如何制作词云图和直方图来分析数据。

数据处理和分析是数据科学和机器学习的重要步骤之一。掌握这些技能可以帮助我们从大量的数据中提取有用的信息,并进行深入的数据分析和可视化。希望本文对你在Python数据处理和分析方面的学习有所帮助!

⭐️希望本篇文章对你有所帮助。

⭐️如果你有任何问题或疑惑,请随时向提问。

⭐️感谢阅读!

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

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

相关文章

[英语单词] components;

*[kәm’pәunәnt] n. 元件, 组件, 成分 a. 组成的, 构成的 【计】 组件 【化】 组分 【医】 成分; 组元(神经元组) 有很多地方使用这个单词,在组成整体时,作为单位一内的占有比率。那为什么不用portion? 这样每一个组成部分都是一个compon…

使用 YOLOv8 和 Streamlit 构建实时对象检测和跟踪应用程序:第 1 部分-介绍和设置

示例:图像上的对象检测 介绍 实时视频中的目标检测和跟踪是计算机视觉的一个重要领域,在监控、汽车和机器人等各个领域都有广泛的应用。 由于需要能够识别和跟踪对象、确定其位置并对它们进行实时分类的自动化系统,对视频帧中的实时对象检测和跟踪的需求日益增加。 在这…

疫情防控【并查集,离线查询,依次删除节点逆向转化为逐渐添上节点】

5 5 3 1 2 1 3 1 5 2 5 3 4 4 3 1 3 1 4 2 3 5 3 3 4 2 3 3 5 1 3 2 3 2 5 3 4输出样例: 1 2 3#include <bits/stdc.h> using namespace std; const int M1e35; const int N2e55; vector<int> e[N]; #define pii pair<int,int> vector<pii> query[M];…

day26 求一段连续子数组之和的最大值

题目描述 方法一&#xff1a;超出时间限制 思路&#xff1a;选一个起点&#xff0c;选一个终点&#xff0c;计算起点到终点的和&#xff1b;求max&#xff1b; 起点几种可能&#xff1a;0 到 size -1; 终点&#xff1a; 起点 到 size -1&#xff1b; int maxSubArray(int* nu…

【网站 全选和单选】js 实现-点击全选按钮时,所有的按钮都会被选中或取消选中。

要实现的效果如图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…

【基本绘图注释函数】——MatLab画图

目录索引 title&#xff1a;ylable&#xff1a;legend&#xff1a; title&#xff1a; 在绘图中添加标签。此类函数的输入是一个字符串。MATLAB 中的字符串是用双引号 (") 引起来的。 上面一部分画图代码这里省略 title("Sample Mass")ylable&#xff1a; 为y轴…

BUUCTF-EasyLogin

这是一道 Node.js 语言的题目&#xff0c;在此记录我在做这道题的思考过程。 这道题考的是 CVE-2022-23540. 简单测试 进入题目环境&#xff1a; 一个登录页面&#xff0c;由题目的名称 EasyLogin&#xff0c;我猜测这道题是身份认证缺陷的问题。不过&#xff0c;还是下意识测…

用主流编程语言解小学题

最近在网上刷到一个视频&#xff0c;内容是奶奶有60 元钱&#xff0c;去超市买了10元水果&#xff0c;收营员应该找奶奶多少钱?我一开始反应就是50元&#xff0c;后来想了想题干里没有说明这60元是怎么构成的&#xff0c;有可能是一张50元和一张10元&#xff0c;或者是3张20元…

day36-JSON+Servlet

0目录 JSONServlet 1.JSONServlet 1.1 创建工程/导入依赖/创建包/BaseDao...... 依赖&#xff1a;javax.servlet、jstl、mysql、taglibs、fastjson <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <…

sqli-labs 1-5 (手注和sqlmap)

sql注入 就是指web运用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是攻击者可控的&#xff0c;并且参数代入数据库查询&#xff0c;攻击者可以构造不同的SQL语句来实现对数据库的任意操作。 当然&#xff0c;SQL注入按照不同的分类方法可以分为很多种&a…

高等数学❤️第一章~第二节~极限❤️极限的概念与性质~函数极限(自变量趋于有限值时的极限)详解

【精讲】高等数学中函数极限&#xff1a;自变量趋于有限值时的极限 博主&#xff1a;命运之光的主页 专栏&#xff1a;高等数学 目录 【精讲】高等数学中函数极限&#xff1a;自变量趋于有限值时的极限 导言 二、函数极限自变量趋于有限值的判定方法 三、函数极限自变量趋于…

回溯算法详解(Back Tracking)

本文已收录于专栏 《算法合集》 目录 一、简单释义1、算法概念2、算法目的3、算法思想 二、核心思想三、图形展示四、算法实现1、实现思路2、代码实现TreeNode 类将数组处理成二叉树结构并且返回根节点进行搜索 五、算法分析1、时间复杂度2、空间复杂度3、算法稳定性 一、简单释…

RestFul风格讲解

以前是localhost:8080/user?methodadd&uid1; RestFul风格是以/接上的 localhost:8080/user/马云/6562 package com.qf.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annot…

freemarker模板在客服域的使用场景及用法介绍

&#x1f34a; Java学习&#xff1a;社区快速通道 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年7月15日 &#x1f34a; 点…

从零搭建秒杀服务

1. 前言 目的&#xff1a;该项目只用于技术交流&#xff0c;不用于过多商业用途。 适用&#xff1a;可用于简历亮点、毕业答辩等。 2. 项目成果 2.1 秒杀主页 包含5个功能点&#xff1a; ①、Product Name&#xff1a;秒杀商品名称 ②、Product Image&#xff1a;秒杀商…

Multiframe-to-Multiframe Network for Video Denoising

Multiframe-to-Multiframe Network for Video Denoising 摘要 现存方法&#xff1a;多相邻帧恢复一个干净帧&#xff0c;效果好但是由于按顺序去噪考虑可能造成视频闪烁&#xff1b; 本文&#xff1a;提出一个多帧对多帧的去噪模型&#xff0c;从连续噪声帧中恢复多个干净帧…

【通览一百个大模型】GLM(THU)

【通览一百个大模型】GLM&#xff08;THU&#xff09; 作者&#xff1a;王嘉宁&#xff0c;本文章内容为原创&#xff0c;仓库链接&#xff1a;https://github.com/wjn1996/LLMs-NLP-Algo 订阅专栏【大模型&NLP&算法】可获得博主多年积累的全部NLP、大模型和算法干货资…

基础算法-【区间合并】

题目 给定 n 个区间 [li,ri]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n行&#xff0c;每行…

《远见》阅读笔记

不同的环境&#xff0c;不同的职业&#xff0c;职业生涯的建议并没有什么不同 找到热爱的工作&#xff0c;建立热爱的生活 如何思考职业远景 如何分配时间 如何扩张人脉 职业生涯决策框架 三个部分 职场思维、框架、工具实用性建议和案例现实生活为基础&#xff0c;平衡职…

MacOS触控板缩放暂时失灵问题解决

我的系统版本为Monterey 12.5.1&#xff0c;亲测有效 直接创建脚本xxx.sh&#xff0c;并在终端执行脚本bash xxx.sh即可解决此问题&#xff0c;脚本内容如下&#xff1a; #!/bin/bashkillall Finder #kill Finder如不需要可以删除 killall Dock #kill Dock 如不需要可以删…