详解使用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')
(效果如图,背景大家可以找点自己喜欢的)

在这里插入图片描述

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值