P公子、R小姐实战:爬取言情小说并做词云分析
拿到一本书,如果不从头到尾仔细看完的话,很难知道这部大剧的主角是谁?
如果开始不知道这部剧的主角,那么刚开始看文章的时候,我们往往会把作者对主角的一些细节描写忽略掉。
如此一来,我们既看不到文章的整体脉络,又无法把握人物的情感变化,看不到一个丰满的人物形象,甚至有的时候还会出现路人甲、炮灰乙不分的情况。
为了解决这个问题,我们一本小说为例,详细讲解其中的步骤。
首先从言情小说吧爬取新书榜第一名的作品,接着对小说进行分词处理,并制作出词云图,帮助我们找出文章的几个主要人物,这样在读小说的时候就有主有次了。
一、爬取言情小说吧新书榜第一名作品
刚开始尝试使用 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