爬取小说章节,并制作成词云进行宣传
需求分析
前两天,一位朋友和我说,“你每次写的爬虫程序,最终的结果多半都是保存为了文本,这太不清晰了!”
我说,“也不是啊,就比如说爬取天气并制作可视化图,这一期中就使用了可视化的方式,能够直观的看到啊。“
他说,”但是,绘制图表的方式不是每次都有效果的,就比如说,如果我要给一个小说进行宣传的话,制作图表的效果就不要,应该学习使用词语。就比说,在qq的个人简介上,就有提供词云的功能。将很多代表这个人物的关键字都保存下来,制作成词云的图,就可以很好的展示这个人的特点了。你可不可以做一个这种的呢?“
当然没问题啊,那我们就研究一下如何制作吧!
实现分析
首先呢,我们需要确定,这次的工作应该分为两步,第一步呢,是爬取小说的章节,第二步呢,是将其制作为词云。那么第一步呢,之前我们已经制作过很多次了,应该不是什么问题。那么关键点就在于如何制作词云了
当然了,这个也不是什么问题,我们不需要真的自己去制作词云,我们只需要使用现成的词云库就可以了,有一个叫做wordcloud的第三方库,就可以很容易的制作词云图
from wordcloud import WordCloud
txt = "词A 词B 词C 词D"
WordCloud().generate(txt).to_file("ciyun.png")
那么还有一个问题,就是如何将词语从文章中分离出来了,这个也不是什么问题,我们只需要使用jieba库就好了
from jieba import lcut
words = lcut(txt)
那么还有一个问题呢,就是我们切分出来的很多词,是否有用了,比如说,我啊,你啊,他啊,好的啊,这些词语没有什么很重要的含义,如果将它们都包括在内的话,恐怕制作出来的效果非常不理想,因此我们应该使用一个中文停用词表,然后将这些不需要的词语去除掉
获取到中文停用词表的方式很多,就比如说在github上,就有这样一个很好的中文停用词项目,这个也可以作为参考
那么到此为止呢,我们的所有准备工作就都已经就绪了,下面就是正式开始制作了
完整代码展示
import requests
from lxml import etree
from jieba import lcut
from wordcloud import WordCloud
from base64 import b64decode
headers = {"user-agent": "Mozilla/5.0"}
url = b64decode("aHR0cHM6Ly9yZWFkLnFpZGlhbi5jb20vY2hhcHRlci9QU1M0MnNjREMySzNEZFl6WFBDR3ZBMi9xWTBWMnRMcjNzNzZJdFRpX0lMUTdBMi8=").decode()
r = requests.get(url, headers=headers)
html = etree.HTML(r.text)
ctt = html.xpath("//div[@id='j_705235484']/p/text()")
ctt = "".join(ctt)
wds = lcut(ctt)
with open("中文停用词表.txt") as f:
c = f.readlines()
nwds = list()
for word in wds:
if word + "\n" in c:
continue
else:
nwds.append(word)
txt = " ".join(nwds)
cy = WordCloud().generate(txt)
cy.to_file("ciyun.png")
那么截止到现在为止,制作的词云效果如何呢?效果如下所示
这是什么东西呢?完全就看不懂啊!哦!原来是,我们的词云库不能够直接支持中文,还得额外为其添加中文字体,才能够正常显示啊,这个原本在我们的计划之外了,不过没关系啊,只需要简单的配置一下,很快就可以使用了,效果如下
这个看起来好像,像是一个词云了,但是为什么这么丑呢?我们在qq上看到的词云都很好看,比如说“天然呆”,“自然萌”,“我这么可爱我不能死”,为什么我们制作的图片这么丑呢?我想,一定是因为黑色的背景太难看了,我们需要通过ps处理一下,把背景替换为白色的,也许就会好了,效果如下
额,现实和理想总是有所差距的,这个似乎还不如刚刚的好看了呢。一定是我们的ps水平太差,没办法很好的处理好这个图片,对一定是这样。而且,现在观察起来的话,最大的问题可能是在同一张图片上,我们包含的词语数量太多了,所以说主次不分明,密密麻麻的挤在一起,所以说,才非常不好看的。下次如果要改进的话,应该尝试减少关键词的数量,让一张图中不要出现这么多关键词,也许就会有所提升
总而言之,词云的功能已经实现了,感觉还算不错?
朋友看完了我的词云图以后非(极)常(其)高(失)兴(望),他说,“仙草哥哥,你做得很好,下次不要做了。”