1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python爬虫豆瓣电影评价_python爬虫入门—统计豆瓣电影评论词频

python爬虫豆瓣电影评价_python爬虫入门—统计豆瓣电影评论词频

时间:2020-04-05 21:32:32

相关推荐

python爬虫豆瓣电影评价_python爬虫入门—统计豆瓣电影评论词频

目标总览

对豆瓣正在上演的电影后面的短评爬取,对评论进行分词,最后根据词频形成标签云展示在浏览器。

需求很简单,很明显需要做三件事,也简单总结一下需要用的包对电影评论用爬虫爬取数据(urllib, BeautifulSoup)

对评论进行分词并统计(jieba)

最后说一下,自己也是python学习者,这个只是一个简易的学习demo,很多没有那么专业,接受批评指教。

实现python版本是python3

本篇主要解释第一步骤,爬评论的思路。

请求网页数据并解析

python内置了请求网页的库urllib。我们需要爬取到两个网页,分别是正在上演的电影和各自的电影评论页,分析一下它们的url地址,正在上演的电影/nowplaying/hangzhou/,

后面需要城市名,我们默认写死成杭州地区,反正现在上映的影片全国都差不多。

评论页是

/subject/25726614/comments?start=20&limit=20

url需要拼接电影的id,这个我们在之前也能爬取到,后面带的有些不需要参数我忽略了,主要是start这个,我们可以做分页,每次取20个。

爬取正在热映电影

废话少说,先把网页爬取下来。

from urllib import request

resp = request.urlopen('/nowplaying/hangzhou/')

html_data = resp.read().decode('utf-8')

之后遇到难题了,如果解析爬下来的网页DOM结构。

这里我用的是BeautifulSoup,上手简单,不多介绍,请看文档/software/BeautifulSoup/bs4/doc/index.zh.html

需要注意的是BeautifulSoup整体解析是一个BeautifulSoup对象,这个对象用find_all()方法返回的是一个list数据结构,然后每一个list item又是一个BeautifulSoup对象,所以解析过程就是不停的在这两个东西转换。

解析如下:

from bs4 import BeautifulSoup as bssoup = bs(html_data, 'html.parser')

第三步就是分析DOM

豆瓣正在上映

主要区域在这里,是一个id为nowplaying的div,之后这个div里面有ul的列表,每个列表里面就是每个电影数据,id的取得我们取巧一些,在每个电影的li标签里,会有一个data-subject的属性,里面是电影的id,同样电影名字我们也可以在img标签里面alt属性取得,最后的数据存在list里,代码如下:

def getNowPlayingMovie_list():

resp = request.urlopen('/nowplaying/hangzhou/')

html_data = resp.read().decode('utf-8')

soup = bs(html_data, 'html.parser')

nowplaying_movie = soup.find_all('div', id='nowplaying')

nowplaying_movie_list = nowplaying_movie[0].find_all('li', class_='list-item')

nowplaying_list = []

for item in nowplaying_movie_list:

nowplaying_dict = {}

nowplaying_dict['id'] = item['data-subject']

for tag_img_item in item.find_all('img'):

nowplaying_dict['name'] = tag_img_item['alt']

nowplaying_list.append(nowplaying_dict)

return nowplaying_list

按这个节奏爬评论页

def getCommentsById(movieId, pageNum):

eachCommentList = [];

if pageNum>0:

start = (pageNum-1) * 20

else:

return False

requrl = '/subject/' + movieId + '/comments' +'?' +'start=' + str(start) + '&limit=20'

resp = request.urlopen(requrl)

html_data = resp.read().decode('utf-8')

soup = bs(html_data, 'html.parser')

comment_div_lits = soup.find_all('div', class_='comment')

for item in comment_div_lits:

if item.find_all('p')[0].string is not None:

eachCommentList.append(item.find_all('p')[0].string) return eachCommentList

关于这个两个函数的衔接逻辑很容易,由于后面断词和排序的耗时都比较大,所以我只循环了第一个电影的前5页:

for i in range(5):

num = i + 1

commentList = getCommentsById(nowPlayingMovie_list[0]['id'], num)

对于处理数据,我们的需求是如何分词,所谓的分词就是将一段话分成一个个有意义的词语,也可以理解为关键词。这里需要用到一个非常牛逼的库——结巴(GitHub - fxsjy/jieba: 结巴中文分词)

用法很简单,一个cut函数轻松的将字符串分隔成词语数组并返回。将爬取下的遍历每条评论分成后加入到字典中,为什么要用字典存储,因为这方便之后的统计词频。

import jiebadef splitToWord(comment):

seg_word_list = jieba.cut(comment) for commentItem in seg_word_list: if not(commentItem == ' '):

addWordDic(commentItem)

处理完毕后开始统计词频,就是上面的addWordDic函数,字典的key是单词,value则表示这个单词的频率:

def addWordDic(word):

if word in commentFreDic:

commentFreDic[word] += 1

else:

commentFreDic[word] = 1

之后,我们就得到了每个词语的词频数据。

end

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。