📚 前言
在信息时代,我们经常需要从大量的文章中获取有用的信息。本文将介绍如何使用Python进行数据处理,获取热榜文章的标题和标签,并使用jieba库进行数据分析。通过本文的学习,你将掌握获取和分析热榜文章数据的技巧。
先上看看效果:
🛠️ 环境准备
在开始编写代码之前,我们需要进行一些环境准备。以下是所需的环境和库:
- 操作系统:Windows
- 编程语言:Python 3
- 编辑器:VSCode(可选)
所使用的库
库名 | 作用 |
---|---|
requests | 发送HTTP请求获取网页内容 |
BeautifulSoup | 处理和分析数据 |
jieba | 中文分词工具 |
wordcloud | 制作词云图 |
matplotlib | 绘制图表 |
csv | csv表格处理 |
json | json格式 |
可以使用以下命令需要安装的库:
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数据处理和分析方面的学习有所帮助!
⭐️希望本篇文章对你有所帮助。
⭐️如果你有任何问题或疑惑,请随时向提问。
⭐️感谢阅读!