您的当前位置:首页正文

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

来源:华佗小知识

目标总览

对豆瓣正在上演的电影后面的短评爬取,对评论进行分词,最后根据词频形成标签云展示在浏览器。
需求很简单,很明显需要做三件事,也简单总结一下需要用的包

  1. 对电影评论用爬虫爬取数据(urllib, BeautifulSoup)
  2. 对评论进行分词并统计(jieba)

最后说一下,自己也是python学习者,这个只是一个简易的学习demo,很多没有那么专业,接受批评指教。
实现python版本是python3
本篇主要解释第一步骤,爬评论的思路。

请求网页数据并解析

爬取正在热映电影

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

from urllib import request
resp = 
html_data = resp.read().decode('utf-8')
from bs4 import BeautifulSoup as bs
soup = bs(html_data, 'html.parser')

第三步就是分析DOM

豆瓣正在上映

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

def getNowPlayingMovie_list():   
   resp =         
   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 =  + 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)
import jieba
def 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