详解使用Python爬取豆瓣短评并绘制词云
使用Python爬取豆瓣短评并绘制词云
成果如下(比较丑,凑合看)
1.分析网页
打开想要爬取的电影,比如《找到你》,其短评如下:
查看源代码
发现短评存放在<span>
标签里 并且class为short,所以通过爬取其里边的内容即可
并且通过翻页发现:url改变的仅仅为start,每次翻页增加20,所以只需for循环增加数字即可控制页数
2.获取其网页内容
我们使用bs4
以及requests
模块进行获取,并使用多线程加快爬取速度
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
# return pageComments
print("%s page" %(pageNum))
global comments
comments += pageComments
# 2).爬取某个电影的前10页评论信息;
id = '27140071'
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]
print("执行结束")
with open("%s.txt" %(id), 'w') as f:
f.write(comments)
成果如下
3.数据清洗
对于爬取的评论信息进行数据清洗(删除不必要的逗号, 句号, 表情, 只留下中文或者英文内容)
在此使用re
模块使用正则表达式进行数据清洗
with open('找到你.txt','a+') as f:
comments = f.read()
print(comments)
# 通过正则表达式实现
pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z]+)')
deal_comments = re.findall(pattern, comments)
newComments = ''
print(newComments)
for item in deal_comments:
newComments += item
print(newComments)
f.write(newComments)
4.制作词云
通过jiaba
(通过词库切割中文)、wordcloud
(制作词云)模块实现
import jieba
import wordcloud
import numpy as np
# 在python2中处理图像,Image; python3中如果处理图像, 千万不要安装Image, 安装pillow
from PIL import Image
# 1). 切割中文, lcut返回一个列表, cut返回一个生成器;
result = jieba.lcut(open('找到你.txt').read())
# 2). 打开图片
imageObj = Image.open('./doc/mao.jpg')
cloud_mask = np.array(imageObj)
# 4). 绘制词云
wc = wordcloud.WordCloud(
mask = cloud_mask,
background_color='black',
font_path='./font/msyh.ttf', # 处理中文数据时
min_font_size=5, # 图片中最小字体大小;
max_font_size=50, # 图片中最大字体大小;
width=500, # 指定生成图片的宽度
)
wc.generate(",".join(result))
wc.to_file('找到你.png')