一、爬取豆瓣影评
基本思路:先获取每个电影的评论区链接,然后依次进入其评论区爬取评论。
用到的包为:bs4,urllib
这里选取的链接为:豆瓣电影,打开后内容如下:
选择两个电影,打开它们的短评页面,它们的链接如下:
我不是药神:https://movie.douban.com/subject/26752088/comments?status=P
邪不压正:https://movie.douban.com/subject/26366496/comments?status=P
观察可以发现,链接的不同之处仅在于两部电影的id号不同(一个是26752088,一个是26366496),因而我们只需要先获取每部电影的id号,就可以打开它们的短评内容进行爬取。然后将短评翻页,观察链接的变化:
第二页:https://movie.douban.com/subject/26752088/comments?start=20&limit=20&sort=new_score&status=P
第三页:https://movie.douban.com/subject/26752088/comments?start=40&limit=20&sort=new_score&status=P
豆瓣的短评一页二十条,所以第二页的start从20开始,第三页从40开始,以此类推,所以我们可以通过改变start的参数控制要爬取的页数。
明白了这些,我们就可以开始动手爬取影评了。当然,为了防止被封IP,笔者每部电影只爬取20页影评,总共爬了10部电影,总共2000条左右的评论,经测试,大约爬取10000条评论的时候会被封IP。
1、获得每个电影的id
首先审查元素,观察网页的结构可知,在一个属性class=‘lists’的ul块下有一系列电影信息,包括我们需要的id号:
于是爬取函数定义如下:
def getFilmList(url):
'''
:param url:网址
:return: 返回电影li标签的列表
'''
bsobj = getbs4(url)
if bsobj == None: return
lists = bsobj.find('ul', {'class': 'lists'}).findAll('li', {'class': 'list-item'})
return lists
2、获取每个电影的短评
因为之后要对获取的短评进行情感分析,所以这里根据每条评论的评分给评论打上标签,3星以上为积极,标为0,1~2星标为1。同时,需要对数据进行预处理,去除标点等无用字符,方便之后的挖掘。最后,将处理后带标签的评论保存在文件中。