本文从豆瓣电影中爬取寻梦环游记的评论作为生成词云的文本数据,废话不多说,走起。
准备数据
由于豆瓣的爬虫监测是比较严格的,一旦发现爬虫就会被BAN,但是我们可以通过预先登陆获取Cookies结合sleep控制爬虫爬取频率来规避豆瓣的爬虫监测。
获取cookies
使用各类浏览器的开发者工具,监测网络请求,截取cookies。
以Firefox为例:
1. 按F12打开开发者工具,切换到网络Tab。
2. 此时登陆豆瓣,开发者工具窗口会截取大量的请求。
3. 寻找其中文件类型为html的项,点击进入详情,在下图的位置找到Cookie,复制到一个文本文件中备用。
编写爬虫
我们使用python中的BeautifulSoup包来编写我们的爬虫.下面给出爬虫完整代码:
#coding = utf-8
import requests
import time
import random
from bs4 import BeautifulSoup
abss = 'https://movie.douban.com/subject/20495023/comments'
firstPag_url = 'https://movie.douban.com/subject/20495023/comments?start=20&limit=20&sort=new_score&status=P&percent_type='
url = 'https://movie.douban.com/subject/20495023/comments?start=0&limit=20&sort=new_score&status=P'
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0',
'Connection':'keep-alive'
}
def get_data(html):
# 获取所需要的页面数据
soup = BeautifulSoup(html, 'lxml')
comment_list = soup.select('.comment > p')
next_page = soup.select('#paginator > a')[2].get('href')
date_nodes = soup.select('..comment-time')
return comment_list, next_page, date_nodes
def get_cookies(path):
# 获取cookies
f_cookies = open(path, 'r')
cookies ={}
for line in f_cookies.read().split(';'): # 将Cookies字符串其转换为字典
name ,value = line.strip().split('=', 1)
cookies[name] = value
return cookies
if __name__ == '__main__':
cookies = get_cookies('./cookies.txt') # cookies文件保存的前面所述的cookies
html = requests.get(firstPag_url, cookies=cookies,headers=header).content
comment_list, next_page, date_nodes = get_data(html) #首先从第一个页面处理
soup = BeautifulSoup(html, 'lxml')
while (next_page): #不断的处理接下来的页面
print(abss + next_page)
html = requests.get(abss + next_page, cookies=cookies, headers=header).content
comment_list, next_page, date_nodes = get_data(html)
soup = BeautifulSoup(html, 'lxml')
comment_list, next_page,date_nodes = get_data(html)
with open("comments.txt", 'a', encoding='utf-8')as f:
for ind in range(len(comment_list)):
comment = comment_list[ind];
date = date_nodes[ind]
comment = comment.get_text().strip().replace("\n", "")
date= date.get_text().strip()
f.writelines(date+u'\n' +comment + u'\n')
time.sleep(1 + float(random.randint(1, 100)) / 20)
处理文本数据
在爬取到文本数据以后,我们需要对其进行一些预处理以利用它生成词云图
代码如下:
# -*- coding:utf-8 -*-
# @Time : 2017-11-28 10:52
# @File : wordcloud_generate.py
# @Description:
from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
f_comment = open("./comments.txt",'rb')
words = []
for line in f_comment.readlines():
if(len(line))==12:
continue
A = jieba.cut(line)
words.append(" ".join(A))
# 去除停用词
stopwords = [',','。','【','】', '”','“',',','《','》','!','、','?','.','…','1','2','3','4','5','[',']','(',')',' ']
new_words = []
for sent in words :
word_in = sent.split(' ')
new_word_in = []
for word in word_in:
if word in stopwords:
continue
else:
new_word_in.append(word)
new_sent = " ".join(new_word_in)
new_words.append(new_sent)
final_words = []
for sent in new_words:
sent = sent.split(' ')
final_words +=sent
final_words_flt = []
for word in final_words:
if word == ' ':
continue
else:
final_words_flt.append(word)
text = " ".join(final_words_flt)
生成词云图
我们使用python的wordcloud模块来生成词云图。
安装:pip install wordcloud
安装完成后,编写脚本即可生成词云图,代码如下
from wordcloud import WordCloud,ImageColorGenerator
from scipy.misc import imread
font = r'C:\Windows\Fonts\FZSTK.TTF'
bk = imread("./background.jpg") # 设置背景文件
wc = WordCloud(collocations=False, mask = bk, font_path=font, width=1400, height=1400, margin=2).generate(text.lower())
image_colors = ImageColorGenerator(bk) # 读取背景文件色彩
plt.imshow(wc.recolor(color_func=image_colors))
plt.axis("off")
plt.figure()
plt.imshow(bk, cmap=plt.cm.gray)
plt.axis("off")
plt.show()
wc.to_file('word_cloud1.png')
效果展示:
可以看到,里面还是包含有一些没有意义的词语,原因是停用词处理的部分仅仅处理的标点符号,没有处理掉一些汉语中常见的停用词,这些都可以使用更加详尽的中文停用词字典来解决。
参考文献: