假设我们现在要生成一个词云,我们首先需要一些文本文件才能根据文本生成词云。
第一步:获取文本信息(这里以某电影的前10页评论为例)
import threading
import requests
from bs4 import BeautifulSoup
# # 1). 爬取某一页的评论信息;
def getOnePageComment(id, pageNum):
# 1). 根据页数确定start变量的值
# 第一页: https://movie.douban.com/subject/26425063/comments?start=0&limit=20&sort=new_score&status=P
# 第二页: https://movie.douban.com/subject/26425063/comments?start=20&limit=20&sort=new_score&status=P
# 第三页: https://movie.douban.com/subject/26425063/comments?start=20&limit=40&sort=new_score&status=P
start = (pageNum-1)*20
url = "https://movie.douban.com/subject/%s/comments?start=%s&limit=20&sort=new_score&status=P" %(id, start)
# 2). 爬取评论信息的网页内容
content = requests.get(url).text
# 3). 通过bs4分析网页
soup = BeautifulSoup(content, 'lxml')
# 分析网页得知, 所有的评论信息都是在span标签, 并且class为short;
commentsList = soup.find_all('span', class_='short')
pageComments = ""
# 依次遍历每一个span标签, 获取标签里面的评论信息, 并将所有的评论信息存储到pageComments变量中;
for commentTag in commentsList:
pageComments += commentTag.text
global comments
comments += pageComments
# 2).爬取某个电影的前10页评论信息;
id = '26425063'
comments = ''
threads = []
# 爬取前10页的评论信息;获取前几页就循环几次;
for pageNum in range(10): # 0 , 1 2 3 4...9
pageNum = pageNum + 1
# getOnePageComment(id, pageNum)
# 通过启动多线程获取每页评论信息
t = threading.Thread(target=getOnePageComment, args=(id, pageNum))
threads.append(t)
t.start()
# 等待所有的子线程执行结束, 再执行主线程内容;
_ = [thread.join() for thread in threads]
with open("%s.txt" %(id), 'w') as f:
f.write(comments)
以上是我们获得的文本信息,但我们会发现有些东西是不需要的,例如:表情,标点符号等
所以我们要对数据进行筛选(数据清洗)
import re
import wordcloud
import jieba ##这两个模块需要安装
# 1. 对于爬取的评论信息进行数据清洗(删除不必要的逗号, 句号, 表情, 只留下中文或者英文内容)
with open('./26425063.txt') as f:
comments = f.read()
# 通过正则表达式实现
pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z]+)') ###过滤为只剩汉字和英文的文本
deal_comments = re.findall(pattern, comments)
newComments = ''
for item in deal_comments:
with open('l.txt','a+') as ff:
ff.write(item)
词云的产生