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

📚 前言

在信息时代,我们经常需要从大量的文章中获取有用的信息。本文将介绍如何使用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数据处理和分析方面的学习有所帮助!

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

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

⭐️感谢阅读!

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸峰轻云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值