美文网首页此地古同
P公子、R小姐实战:爬取言情小说并做词云分析

P公子、R小姐实战:爬取言情小说并做词云分析

作者: 鲨瓜 | 来源:发表于2018-10-31 21:27 被阅读0次

    拿到一本书,如果不从头到尾仔细看完的话,很难知道这部大剧的主角是谁?

    如果开始不知道这部剧的主角,那么刚开始看文章的时候,我们往往会把作者对主角的一些细节描写忽略掉。

    如此一来,我们既看不到文章的整体脉络,又无法把握人物的情感变化,看不到一个丰满的人物形象,甚至有的时候还会出现路人甲、炮灰乙不分的情况。

    为了解决这个问题,我们一本小说为例,详细讲解其中的步骤。

    首先从言情小说吧爬取新书榜第一名的作品,接着对小说进行分词处理,并制作出词云图,帮助我们找出文章的几个主要人物,这样在读小说的时候就有主有次了。

    一、爬取言情小说吧新书榜第一名作品

    刚开始尝试使用 requests 请求的方法爬取页面信息,但发现利用 requests 爬取的** HTML **代码与原始页面的代码明显不同。

    因此,果断放弃第一种方法。尝试利用 selenium 模拟浏览器请求的方法获取页面信息,毫无疑问,成功爬取到了想要的信息。

    先看一下我们将要爬取的原始网页吧。

    image

    这本新书榜排名第一的小说目前更新到了第52章,因此我们的代码中一定会涉及到循环

    接下来是分析每一章节的 url 规律,很容易就发现只有最后面的一串数字在发生改变,而且每一章节的 HTML 代码中隐藏着下一章节的 url 。

    image

    这样就好办了,直接提取出下一章节 url 和本章节的文本,就可以了。

    # -*-coding:utf-8 -*-
    
    from seleniumimport webdriver
    import pandasas pd
    
    chrome_options= webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    driver =webdriver.Chrome(chrome_options=chrome_options)
    
    url ='https://www.xs8.cn/chapter/11849028203400903/31807954486539149'
    save_text = []
    
    for i in range(52):
        if i == 0:
            driver.get(url=url)
            button =driver.find_element_by_class_name('green-btn')
            button.click()
            next_chapter =driver.find_element_by_xpath('//*[@id="chapter-31807954486539149"]')
            next_chapter_url =next_chapter.get_attribute('data-nurl').split('/')[-1]
            url ='https://www.xs8.cn/chapter/11849028203400903/{}'.format(next_chapter_url)
    
            text =driver.find_element_by_xpath('/html/body/div[1]/div[4]/div[1]/div[2]/div/div[2]')
            save_text.append(text.text.strip())
        else:
            driver.get(url=url)
            next_chapter =driver.find_element_by_xpath('//*[@id="chapter-{}"]'.format(next_chapter_url))
            next_chapter_url =next_chapter.get_attribute('data-nurl').split('/')[-1]
            url ='https://www.xs8.cn/chapter/11849028203400903/{}'.format(next_chapter_url)
    
            text =driver.find_element_by_xpath('/html/body/div[1]/div[4]/div[1]/div/div/div[2]')
            save_text.append(text.text.strip())
    
    dic ={'text':save_text}
    novel =pd.DataFrame(dic)
    novel.to_csv('d:/novel.csv',index=False)
    

    接下来看看我们爬取的成果吧,一部小说就在那里了。

    image

    二、分词处理并制作词云图

    在前几期的文章中我们已经学会了如何安装并加载所需的包,如何读取文件,以及如何制作词云图,因此,本期文章不再赘述。

    library(jiebaR)
    chapter = read.csv('d://novel.csv',encoding = 'UTF-8')
    items = chapter$text
    text = paste(items)
    cutter <- worker(stop_word = 'd:/stop.txt') #注释1
    segtext = segment(text,cutter)
    segtext = gsub('[0-9a-zA-Z]','',segtext)
    library(stringr)
    segtext = str_trim(segtext)
    tableword = table(segtext)
    library(wordcloud2)
    wordcloud2(tableword)
    

    在这里我们一定要注意注释1,stop_word 打开的文件一定要是 UTF-8 编码的停用词表,否则一定会报错,看看我们制作的词云吧。

    image

    沈字贯穿始终,这是一个关于沈家的故事。毫无疑问,沈陌是这部剧的主角,接下来依次是清清、何秀娟、盛骁、东东等等。

    这样一来我们就对小说中主要的人物有了一个大概的了解,如果再能够出现一些感情词汇的话,我们甚至能推测出小说中的一些爱恨情仇。


    今天又复习了一遍 selenium 的使用方法,并且做了无头化处理,接着我们又演示了一遍词云的制作过程,以及停用词表的使用规范。

    OK,今天的任务已经完成了,咱们下期再见。

    后台回复:想你了。可获得停用词表及源码。

    你可能还想看

    等你很久啦,长按加入古同社区

    image

    相关文章

      网友评论

        本文标题:P公子、R小姐实战:爬取言情小说并做词云分析

        本文链接:https://www.haomeiwen.com/subject/kwyztqtx.html