主页
avatar

Kared

如何优雅获取网络博客内容并生成文字云

本文将要探索的是如何将网络博客的文字内容转化为既美观又有趣的文字云。文字云不仅能够为我们提供一种直观的数据可视化手段,还能帮助我们快速识别文本数据中的关键词汇和主题。

获取网络博客内容

在获取网络博客内容的过程中,运用网络爬虫技术时,必须恪守相关网站通过 robots.txt 文件设定的准则,同时也要确保符合网站的使用条款和相关法律规定。

网络爬虫获取数据

在进行网络爬虫开发时,获取网页内容是一个基本而关键的步骤。为了实现该功能,我们通常会依赖于 requests 库来发起网络请求,以及使用 BeautifulSoup 库来解析和提取 HTML 文档中的数据。这两个强大的 Python 库共同构成了网络爬虫的核心工具集。

如果您是在这方面的初学者,或者希望进一步提升您的技能,以下两篇精选博客文章可以作为您的指南:

[post cid=“95” cover="" size=""/]

[post cid=“96” cover="" size=""/]

这两篇文章都配有丰富的示例和代码片段,可以帮助您快速上手,并在实际项目中应用这些工具。无论您的目标是简单的数据抓取还是构建复杂的数据采集系统,掌握 requestsBeautifulSoup 将为您打开新世界的大门。

一个简单的抓取并提取指定网页内容的网络爬虫示例代码如下所示:

# coding=utf-8
from bs4 import BeautifulSoup
import requests

# 用户输入网站链接
url = input("请输入要爬取的网站链接:")
headers = {'user-agent': 'Mozilla/5.0'}

try:
    # 发起网络请求获取网页内容
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    response.encoding = response.apparent_encoding
    # 使用BeautifulSoup解析网页内容
    soup = BeautifulSoup(response.text, 'html.parser')
    body_text = soup.body.get_text()
    print(body_text)

except requests.RequestException as e:
    print("请求错误:", e)
except Exception as e:
    print("发生错误:", e)

处理网络数据

在处理博客数据时,我们将借助于 re 正则表达式库和 jieba 库这两个强大的工具。

正则表达式是处理字符串的一种高效方法,它通过特定的模式匹配和操作字符串。re 库在Python中提供了丰富的接口来构建和应用正则表达式。如果你对正则表达式的使用不够熟悉,可以参考下面博客来学习相关内容:

[post cid=“97” cover="" size=""/]

jieba 库是一个广受欢迎的 Python 中文分词工具。jieba 的分词算法基于一个中文词库,利用前缀词典实现高效的词图扫描,构建句子中汉字构成的有向无环图(DAG),再采用动态规划查找最大概率路径,从而实现准确的分词。

在使用 jieba 中文分词库进行文本处理时,提供了四种主要的分词模式可供选择,以适应不同的应用场景:

  1. 精确模式:这是 jieba 的默认分词模式,它尝试将句子最精确地切开,适用于大多数分词需求。通常不会切分出非词典中的词汇,因此在精度上是最高的。
  2. 全模式:在全模式下,jieba 会扫描整个句子,并给出所有可能的词语。这种模式速度非常快,但是会产生大量冗余词汇,因此不太适合精确度要求高的任务。
  3. 搜索引擎模式:这种模式在精确模式的基础上,会进一步对长词进行切分,以便于搜索引擎更好地索引文章。这对于提升搜索引擎的索引效率和结果的相关性非常有帮助。
  4. Paddle模式jieba 利用了基于深度学习的模型来进行分词,通常能够提供更好的分词效果,特别是在处理一些特殊情况时,提高了分词的准确性,但需要另外安装 paddlepaddle

[collapse status=“false” title=“jieba 库的安装及简单使用”]

开始使用 jieba 库前,我们需要在开发环境中安装它,在终端或命令提示符中输入以下命令:

pip install jieba

安装完成后,就可以使用了,如需详细了解 jieba 的更多信息和高级功能,可以访问其官方文档:jieba GitHub 页面

jieba 库的使用非常直观,下面是一个简单的示例,展示了如何在 Python 代码中使用不同的分词模式:

# coding=utf-8
import jieba

text = "我来到了北京天安门前"

# 使用精确模式
words = jieba.lcut(text)
# 我/来到/了/北京/天安门/前
print("精确模式:", "/".join(words))

# 使用全模式
words = jieba.lcut(text, cut_all=True)
# 我/来到/了/北京/天安/天安门/门前
print("全模式:", "/".join(words))

# 使用搜索引擎模式
words = jieba.lcut_for_search(text)
# 我/来到/了/北京/天安门/前
print("搜索引擎模式:", "/".join(words))

# 使用paddle模式(需要先安装paddlepaddle)
words = jieba.lcut(text, use_paddle=True)
# 我/来到/了/北京/天安门/前
print("Paddle模式:", "/".join(words))

[/collapse]


首先,我们使用正则表达式匹配所有的汉字字符,在 Unicode 编码中,汉字的范围大致是从 \u4e00\u9fa5。为了后续更好地分析文本内容,我们还需要清除文本中的标点符号和数字,具体代码如下:

# coding=utf-8
import re

# 假设body_text是我们爬取到的包含中文的文本内容
chinese_text_list = re.findall(r"[\u4e00-\u9fa5]+", body_text)
chinese_text = "".join(chinese_text_list)

# 定义一个包含常见中文标点符号和数字的字符串
punctuations_and_numbers = "《》,。:!‧「」『』〈〉;﹖.! \n?()0123456789"

# 移除文本中的标点符号和数字
for ch in punctuations_and_numbers:
    chinese_text = chinese_text.replace(ch, "")

# 输出文本总体长度
print("文本总体长度:", len(chinese_text))

利用上述提取的文本信息,我们能够分析并计算出每个汉字在文章中出现的频率:

# 页面文章的字种
unique_characters = set(chinese_text)
print("文章的字种:\n", unique_characters)
print("共有字种个数:", len(unique_characters))

# 文章的字频
character_frequency = {}
for char in chinese_text:
    character_frequency[char] = character_frequency.get(char, 0) + 1

# 输出字频统计结果
for char, frequency in character_frequency.items():
    print(f"字符 '{char}' 出现了 {frequency} 次")

当然,为了生成词云,我们需要利用 jieba 库对文本进行分词处理,然后统计每个词语的出现频率:

# coding=utf-8
import jieba

# 对文本进行分词
words_list = jieba.lcut(chinese_text)

# 统计词频
counts = {}
for word in words_list:
    if len(word) > 1:
        counts[word] = counts.get(word, 0) + 1

# 将词频字典转换为一个列表,便于排序
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)

# 打印每个高频词及其出现次数
print("各高频词出现次数:")
for word, count in items:
    print(f"{word}: {count}次")

生成文字云

在数据可视化的众多技术中,词云以其独特的视觉效果和信息传达方式,成为了展现文本数据特点的一种流行手段。词云是一种特殊的可视化方式,通过不同大小、颜色和位置来展示单词的频率或重要性。

WordCloud 库

WordCloud 是一个 Python 第三方库,用于生成词云图像。它内置了文本解析和绘制功能,可以轻松地创建出美观且信息丰富的词云图。WordCloud 库支持自定义形状、颜色、字体和布局,使得每一张生成的词云图都能够独一无二。

安装 WordCloud 库

在开始使用 WordCloud 之前,需要确保已经安装了这个库,可以通过下面命令进行安装:

pip install wordcloud

如何使用 WordCloud

使用WordCloud库生成词云的基本步骤非常简单:

  1. 准备文本数据:你需要一个字符串,其中包含了所有你想在词云中展示的文本。
  2. 创建 WordCloud 对象:实例化一个 WordCloud 类的对象,可以在这一步设置各种自定义参数。
  3. 生成词云:调用 WordCloud 对象的generate方法,输入你的文本数据。
  4. 显示或保存词云:使用 matplotlib 库显示词云,或者将其保存为图片文件。

下面是一个简单的例子:

# coding=utf-8
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 准备文本数据
text = 'Python is a great programming language. WordCloud is a great library.'

# 创建WordCloud对象
wordcloud = WordCloud(width=800, height=400).generate(text)

# 显示词云图像
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')  # 不显示坐标轴
plt.show()

其中,WordCloud 对象的主要方法包括:

  • generate(text):加载文本数据,生成词云。
  • to_file(filename):将生成的词云保存为图片文件。

自定义 WordCloud

WordCloud 库的魅力在于其灵活的定制能力,允许用户根据自己的需求塑造独特的词云,以下是一些广泛使用的定制选项,它们提供了丰富的个性化可能性:

  • widthheight:设置生成词云图像的宽度和高度。
  • max_words:设置词云显示的最大单词数量。
  • mask:设置词云的形状,需要传入一个形状的numpy数组。
  • background_color:设置背景颜色,默认为黑色。
  • font_path:设置字体路径,用于显示中文或者自定义字体。
  • colormap:设置词云中字体的颜色映射表。
  • min_font_sizemax_font_size:设置生成词云中最小和最大字号。
  • font_step:设置词云中字体字号的步进间隔。
  • stop_words:指定词云的排除词列表。

例如,如果你想创建一个特定形状的词云,简单的代码示例如下:

# coding=utf-8
from wordcloud import WordCloud, STOPWORDS
from PIL import Image
import numpy as np


# 将分词列表转化成字符串并剔除单个字
words_list = [item for item in words_list if len(item) > 1]
words_string = " ".join(words_list)

# 使用 Pillow 库读取背景图片,并转换为 numpy 数组
mask_image = np.array(Image.open(r'./background.png'))

# 初始化WordCloud对象
word_cloud = WordCloud(
    background_color='white',       # 设定背景颜色为白色
    mask=mask_image,                # 使用自定义的图片作为词云形状
    font_path='simfang.ttf',        # 指定中文字体以正确显示文字
    max_words=2000,                 # 词云显示的最大词数
    stopwords=STOPWORDS,            # 使用内置的屏蔽词
    max_font_size=150,              # 字体最大值
    random_state=30                 # 随机状态数,影响颜色的多样性
)

# 根据分词结果生成词云
word_cloud.generate(words_string)

# 保存词云图像到文件
word_cloud.to_file("./wordcloud.png")

生成的词云效果如下图所示:

本文词云

Python WordCloud jieba BeautifulSoup Requests