Py学习  »  Python

Python 爬取豆瓣电影评论并生成词云图(二)

爬虫俱乐部 • 5 年前 • 714 次点击  


爬虫俱乐部之前推出的线下培训,得到了各位老师的一致好评。为了更加方便大家学习,满足更多Stata用户的学习需求,爬虫俱乐部已隆重推出在线直播课程,请大家奔走相告!课程报名链接:https://ke.qq.com/course/286526#tuin=9735fd2d,详情见推文《爬虫俱乐部隆重推出网上直播课程第一季

有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

好消息:爬虫俱乐部即将推出研究助理供需平台,如果您需要招聘研究助理(Research Assistant or Research Associate),可以将您的需求通过我们的公众号发布;如果您想成为一个RA,可以将您的简历发给我们,进入我们的研究助理数据库。帮我们写优质的推文可以提升您被知名教授雇用的胜算呀!



在上一回的介绍中(Python 爬取豆瓣电影评论并生成词云图(一)),我们提到了如何获取单页评论,并熟悉了相关库的使用方法,在后面的推文中,我们将介绍获取多页评论、分词以及生成词云图,时不我待,快快开始吧~

  获取多页评论

那么我们如何获取多页的评论呢?当然还是循环。

我们可以设定要获取多少页的评论,最后仍返回一个列表。

参数movie_id是电影id,page_num则是我们想要获取的评论页数。

前面我们说过,每页评论只需改变start后面的数字即可,所以我们用20*i,然后用str函数将结果转为字符串进行拼接。

Movie_id也进行拼接是为了以后可以只需更改电影id就可以获取不同电影的评论。

将每次循环返回的列表再相加,形成一个大列表data

最后returnjoin函数将内容用空分隔。就相当于最后返回的是一篇文章,所有评论都在里面,便于后续的分词。

def parsepage(movie_id, page_num):

data = []
      for in range(page_num):
          url =
"https://movie.douban.com/subject/"+ str(movie_id) + "/comments?start=" + str(20 * i) + "&limit=20"
          data +=onepage(url)
          print("parsing page %d" % (i+1))#提示信息,显示当前正在解析第几页
          time.sleep(
6)#每解析一页,就暂停6秒钟。防止给服务器造成不必要的资源浪费
      return " ".join(data)

如图,以下就是返回的结果。


  进行分词

接下来,通过jieba中文分词对列表的评论进行分词。

jieba是基于Python的中文分词工具,安装使用非常方便,直接pip即可:

执行命令安装:pip install jieba 

这里是jieba分词的官方网站:

https://github.com/fxsjy/jieba

安装完毕我们导入:

通过上面返回的data,我们将data直接传入jiebalcut方法。然后就返回了分词结果。

import jieba

all_comments =jieba.lcut(data)

print(all_comments)

我们可以将其打印出来看一下:

可以发现jieba分词已经将评论内容分解为一个一个的单字或词语,并且是一个列表。

因为生成词云图需要的是每个词语之间用空格分隔,所以我们还是用join方法,将上面返回的分词结果传入join函数,将其用空格分隔,并存入words列表。

words = []
words = " ".join(all_comments)

至此,words就是我们需要生成词云图的文字内容。

现在,我们已经将评论内容的准备工作完成。

生成词云图

激动人心的时刻终于到来!

使用Wordcloud库将其生成漂亮的词云图。

同样,使用命令安装:pip install wordcloud

这里是wordcloud的主页:

https://github.com/amueller/word_cloud

可以在这里对wordcloud有个大致了解。

注意:安装期间可能会出现错误:需要VC ++ 库等,此时不要着急。这里给出解决方案:

https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud

打开上面的网址,会跳转到如下界面:根据你的版本进行下载。

下载下来后,打开命令行(cmd),转到文件所在路径,使用命令进行安装:

pip install wordcloud-1.4.1-cp36-cp36m-win32.whl

install 后面的文件名根据你的下载版本替换(tab键自动补全)

安装完就可以正常使用啦。

导入Wordcloud库,使用wordcloud的WordCloud方法,注意首字母大写,进行初始化设置:

其中,width是图片宽度,height是图片高度,background_color是背景颜色,font_path是字体文件路径(例子中的文件是微软雅黑字体,如果不加字体可能会出现无法显示中文的情况)。然后通过generate方法生成词云图。参数就是上面的words。

import wordcloud
wc=wordcloud.WordCloud(width=1500,height=1500,background_color="white",font_path="./msyh.ttc")
wc.generate(words)

还剩最后一步:

保存文件:通过to_file()方法将文件存储到本地。参数就是文件名。

wc.to_file("image.jpg")

如何找到字体文件:

C:\Windows\Fonts路径下存储的是字体文件。找到

将其复制出来,放到你所编辑的py文件的相同目录。同样,保存的图片也是这个路径。

至此,这个生成词云图的小程序就结束啦!可能写的比较啰嗦,不是非常详细,不过只要你跟着做一遍,肯定会有很多收获。多做两次,你也会做词云图。


本程序所在环境:

Python3.6

库:requests/ BeautifulSoup / wordcloud / jieba/ time

以下是完整代码:

#导入所需库
import requests
from bs4 import BeautifulSoup
import wordcloud
import jieba
import time
#电影id
movie_id =24773958

#获取单页的评论,返回评论列表
def onepage(url):
   r = requests.get(url)
   r.encoding = "utf-8"
   html = r.text
   soup = BeautifulSoup(html,"html.parser")
   comments_sec = soup.find("div","mod-bd")
   comments_list =comments_sec.find_all("p", "")
   lst = []
   for i in range(len(comments_list)):
      lst.append(comments_list[i].text.strip())

   return lst

#获取多页评论,返回总列表
def parsepage(movie_id, page_num):
   data = []
   for i in range(page_num):
       url ="https://movie.douban.com/subject/" + str(movie_id) +"/comments?start=" + str(20 * i) + "&limit=20"
       data += onepage(url)
       print("parsing page %d" %(i+1))
       time.sleep(6)#每隔6秒爬取一页,豆瓣默认5秒,太频繁了不好哦

   return "".join(data)


def main():
   data = parsepage(movie_id, 10)#10为要爬取的页数
   all_comments = jieba.lcut(data)
   words = " ".join(all_comments)
   print("正在生成词云图……")
   wc=wordcloud.WordCloud(width=1500,height=1500,background_color="white",font_path="./msyh.ttc")
   wc.generate(words)
   wc.to_file("image.jpg")
   print("ok")

main()

效果图(实际效果可能和下图不同,颜色是每次随机改变的):


 一起来试试吧~~


注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~


                                   



             文字编辑:赵宇亮

  技术总编:刘贝贝

往期推文推荐:

1.爬虫俱乐部新版块--和我们一起学习Python

2.hello,MySQL--Stata连接MySQL数据库

3.hello,MySQL--odbcload读取MySQL数据

4.再爬俱乐部网站,推文目录大放送!

5.用Stata生成二维码—我的心思你来扫

6.Mata中的数据导出至Excel

7.谈谈图形中坐标设置的技巧

8.如何输出某个关键词在字符串中的所有位置?

9.想看什么书?Stata君帮你寻!——爬取中南财大图书馆书目信息

10.爬虫俱乐部隆重推出网上直播课程第一季




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/YNdYfJyHlT
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13117
 
714 次点击