Python爬虫之wordcloud+jieba爬取小说并生成词云(八)

原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
本次代码的环境:
运行平台: Windows
Python版本: Python3.x
IDE: PyCharm

一、 前言

今天这篇文章写的内容是爬取《全书网》http://www.quanshuwang.com/book/9/9055 的《盗墓笔记小说》,然后用词云分析小说里面出现最多的词语是什么。知道了需求,那先看一下爬取的页面,如图1所示:
 

在这里插入图片描述
图1

然后将问题具体化:
1) 如何爬取每一篇文章的内容
2) 如何爬取全部的内容
3) 如何将爬取到的内容写入到指定的文件中
4) 如何读取文件内容并生成词云
既然已经明确了问题,然后根据已经掌握的爬虫经验(参考文章Python爬虫之BeautifulSoup+Requests爬取喜欢博主的全部博文(六))可以知道,可以为每一个问题写一个函数,对于第二个问题,可以通过获取他们的URL,然后通过将URL传入到第一个问题写的函数中去,然后再写一个write函数,将爬取到的内容写到文件中,最后通过wordcloud和jieba库,生成想要的词云,这个是整体思路。
免责说明:本篇文章只是为了交流学习使用,完全没有任何额外使用爬取的数据,如有侵权行为,我会立刻删除该文章内容.

二、 代码编写与效果展示

按照以往的惯例,还是先给出完整的代码和最终的效果:

1、 代码:

import requests
from bs4 import BeautifulSoup
import wordcloud
import jieba

class Download(object):

    #定义初始化变量以及相关内容
    def __init__(self):
        self.target = 'http://www.quanshuwang.com/book/9/9055'
        self.href_list = []
        self.chapter_name = []
        self.num = 0
        self.head = {   
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
            'Accept': 'text/html,application/xhtml',
            'connection': 'keep-alive',
            'Accept - Encoding':'gzip, deflate'
            }

    #用于获取小说目录的全部url
    def get_url(self):
        req = requests.get(url=self.target,params='html',headers=self.head)
        req.encoding = 'gbk'
        html = req.text
        bf_url = BeautifulSoup(html,features="html.parser")
        div = bf_url.find_all('div',class_='clearfix')
        div_a = BeautifulSoup(str(div[1]),features="html.parser")
        a = div_a.find_all('a')
        #删除不要的章节!
        self.num = len(a[:10])
        #print(self.num)
        #print(a[:10])
        for each in a[:10]:
            self.chapter_name.append(each.string)
            self.href_list.append(each.get('href'))

    # URL获取好列表了,该模块进行下载储存
    def down_novel(self,herf):
        url = requests.get(url=herf)
        url.encoding='gbk'
        url_text = url.text
        url_bf = BeautifulSoup(url_text,features="html.parser")
        url_bf_div =url_bf.find_all('div',class_='mainContenr')
        self.url_bf_div_text= url_bf_div[0].text.replace('\xa0'*8,'\n\n')

    def write(self):
        with open('novel.txt', 'a', encoding='utf-8') as f:
            f.write('\n')
            f.writelines(self.url_bf_div_text)
            f.write('\n\n')

    def wordCloud_show(self):
        f = open('C:/Users/Administrator/PycharmProjects/practice2/novel.txt','r',encoding='utf-8')
        t = f.read()
        f.close()
        ls = jieba.lcut(t)
        txt = ' '.join(ls)
        w = wordcloud.WordCloud(font_path = 'c:\windows\Fonts\STZHONGS.TTF',width = 1000,height = 700,background_color = 'white')
        w.generate(txt)
        w.to_file('novelWordcloud.png')

if __name__ == '__main__':
    dl = Download()
    dl.get_url()
    index = 0
    for i in dl.href_list:
        dl.down_novel(i)
        dl.write()
        index += 1
        print("\r# Process: %0.2f %%" % (float(index) / float(dl.num)*100 ), end='')
    dl.wordCloud_show()

2、 效果展示:

如图2是下载小说的进度条(因为小说全文内容比较多,所以只爬取了部分小说内容)
 

  在这里插入图片描述
图2

如图3是下载的小说内容,文件名为novel扩展名为.txt文件
 

在这里插入图片描述
图3

如图4是读取小说内容生成的词云,从图中我们可以看到,本篇文章应该讲的是一个“佛爷”和“古楼”的故事。
 


在这里插入图片描述
图4

三、代码讲解

大部分代码,这篇文章(Python爬虫之BeautifulSoup+Requests爬取喜欢博主的全部博文(六))都已经涉及到了在此就不在赘述了,其中的打印进度条可以参考这篇文章内容(Python小应用之进度条打印
这次主要内容是讲解wordcloud和jieba库

1、代码展示

def wordCloud_show(self):
        f = open('C:/Users/Administrator/PycharmProjects/practice2/novel.txt','r',encoding='utf-8')
        t = f.read()
        f.close()
        ls = jieba.lcut(t)
        txt = ' '.join(ls)
        w = wordcloud.WordCloud(font_path = 'c:\windows\Fonts\STZHONGS.TTF',width = 1000,height = 700,background_color = 'white')
        w.generate(txt)
        w.to_file('novelWordcloud.png')

2、wordcloud库的讲解以及词云的生成

这段代码是典型的生成词云的方法之一,为了更好的讲解代码,首先还是先了解worldcloud库的基本内容:

worldcloud库把词云当做一个wordcloud对象,其中wordcloud.WordCloud()代表一个文本对应的词云,可以根据文本中词语出现的频率等参数绘制词云,可以包括绘制词云的形状、尺寸、颜色等属性。

生成词云的常规方法是:

  • 配置对象参数:c=wordcloud.WordCloud(XXXX)
  • 加载词云文本: c.generate(待分析的文本)
  • 输出词云文件: c.to_file(“XX.png”)(可输出的格式有png和jpg)
配置对象参数:

font_path : string #字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = ‘黑体.ttf’
width : int (default=400) #输出的画布宽度,默认为400像素
height : int (default=200) #输出的画布高度,默认为200像素
mask : nd-array or None (default=None) #如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread(‘读取一张图片.png’),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。
min_font_size : int (default=4) #显示的最小的字体大小
font_step : int (default=1) #字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差
max_words : number (default=200) #要显示的词的最大个数
stopwords : set of strings or None #设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
background_color : color value (default=”black”) #背景颜色,如background_color=‘white’,背景颜色为白色
max_font_size : int or None (default=None) #显示的最大的字体大小

3、jieba库

中文文本需要通过分词获得单个的词语,jieba库是优秀的中文分词第三方库,jieba库的分词原理:

  • 利用一个中文词库,确定汉字之间的关联概率
  • 汉字间概率大的组成词组,形成分词结果
  • 除了分词,用户还可以添加自定义词

jieba库的使用说明,三种模式:

  • 精确模式:把文本精确的切分开,不存在冗余单词
    jieba.lcut(s)—返回列表型分词结果
    如:
>>>jieba.lcut('中国是一个国家')
['中国''是''一个''国家']
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余
    jieba.lcut(s,cut_all = True),返回一个列表
  • 搜索引擎模式:在精确模式的基础上,堆场单词再次切分
    jieba.lcut_for_search(s)
  • jieba.add_word(w)向jieba库中增加词语
    接下来我会单独对jieba库和wordcloud库进行更详细的讲解。

三、总结

本文主要采用了Requests+BeautifulSoup+jieba+wordCloud库对爬取的内容进行分词词云表示,其中涉及到一个class类Download(object),在类里面定义了五个函数分别是:def init(self)定义初始化变量以及相关内容,get_url(self)用于获取小说目录的全部url,down_novel(self,herf)URL获取好列表了,该模块进行下载储存,write(self)将文本信息写到文件中,wordCloud_show(self)生成词云。并在主函数中,通过实例化class类,调用其中的函数,从而实现了,爬取小说信息,并生成词云。同时也希望大佬们批评指正,因为是新手难免会有说的不恰当甚至错误的内容,还请大佬们不要手下留情。

  • 10
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值