首页 编程教程正文

【爬虫】爬行豆瓣电影短评

piaodoo 编程教程 2020-02-22 22:05:00 915 0 python教程

本文来源吾爱破解论坛

本帖最后由 c0ld 于 2019-7-13 20:49 编辑

这段时间在做关于爬虫的一个项目,其中遇到了一个功能需求:根据电影海报获取豆瓣影评,然后生成词云
大致的思路便是1.OCR识别从图片中获取电影名称 -> 2.爬取豆瓣影评 -> 3.提取关键词 -> 4.生成词云
在编程的过程中我遇到的问题就在于 2.爬取豆瓣影评 这一流程中,接下来列举在实现这一功能的过程中遇到的问题以及解决方案

1. 无法根据电影名称在豆瓣中找到电影详情页(豆瓣搜索结果页面使用了Ajax渲染技术)
2. 爬行速度过于缓慢(这个问题除了网络等客观原因以外,最主要的还是爬虫算法的选择上)

目前脑海中就只记得这两个问题了,如果后续想起来还有其他问题再进行补充
首先对于第一个问题出现的原因就在于 我是通过OCR文字识别从海报中提取的电影名称
意为在现阶段我们只有一个电影名称的变量,在遇到这个问题的时候我的第一反应便是看看豆瓣电影详情页的URL,是否有规律可寻
下面贴上两部电影详情页的URL:

1.jpg (73.38 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-13 20:45 上传

2.jpg (80.95 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-13 20:45 上传


通过以上图片我们可以观察到电影详情页的URL构成重点在于subject/后的电影编号上,但是我们发现这个编号没啥什么卵子规律,暂时放下获取电影编号的想法
于是我的方向重新放在了搜索页面,搜索页面中是存在电影详情页的URL超链接的,就像这样:

3.jpg (57.85 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-13 20:46 上传


那一瞬间的我错认为问题已经被解决,当我准备分析页面结构时,我又重新回到了起点:

4.jpg (73.29 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-13 20:46 上传


豆瓣在搜索页面使用了Ajax渲染技术,这种技术利用JavaScript在保证页面不被刷新,页面链接不改变的情况下与服务器交换数据并更新部分网页
意为在原页面中嵌入JavaScript脚本,通过该脚本来在原页面中拼接数据内容,像是这样:

5.jpg (28.79 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-13 20:46 上传


我们爬虫此时爬行到的网页数据只是基本框架,并没有爬行到我们想要的数据,那么我们的解决方案有以下两种:
1.通过Py特定模块来实现突破Ajax页面渲染进行爬行,例如Selenium和Splash模块都是可以突破这种技术的
2.另辟蹊径
本着不作死有助于提高人生幸福感的原则,我自然是选择了第二条路-另辟蹊径,通过查询相关资料,我了解到了豆瓣提供了一个公开的API:
https://api.douban.com/v2/movie/search?q=电影名称&start=0&count=10
但是出现了一个很严肃的问题:这个API的官方接口文档丢了!
豆瓣好像忘了还有这么一个API的存在,原本应该是记录API使用说明的页面被关闭了,百度半天找到了一个私人博客里的使用总结:
https://www.cnblogs.com/oskyhg/p/9749373.html
返回数据格式如下:

6.jpg (43.08 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-13 20:46 上传



可以看到这个API中返回的数据由我们想要的电影编号(就是表中的电影ID)

7.jpg (167.16 KB, 下载次数: 2)

下载附件  保存到相册

2019-7-13 20:46 上传


那么我们的问题便迎刃而解
总结一下我们最后的编程思路:
1.在API中查询该电影的ID
2.使用字符串拼接获得电影详情页URL
3.爬行电影影评

最后贴上成品代码:
[Python] 纯文本查看 复制代码
def getComment(movieName):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
    movieName = urllib.quote(movieName)
    url = "https://api.douban.com/v2/movie/search?q=" + movieName + "&start=0&count=10"
    movieInfoJson = requests.get(url, headers=headers).text
    movieInfoJson = json.loads(movieInfoJson)
    movieInfoUrl = movieInfoJson['subjects'][0]['alt']
    page = 0
    while page < 200:
        commentList = []
        commentUrl = movieInfoUrl + "/comments?start=" + str(page) + "&limit=20&sort=new_score&status=P"
        html = requests.get(commentUrl, headers=headers).text
        pat = '<span class="short">(.*?)</span>'
        data = re.compile(pat).findall(html)
        page = int(page) + 20
        for i in data:
            commentData = i.encode('utf-8')
            commentList.append(commentData)
            comment = ",".join(commentList)
            commentList.append(comment)
        comment = commentList[0]
        return comment

8.jpg (167.16 KB, 下载次数: 3)

下载附件  保存到相册

2019-7-13 20:47 上传

8.jpg

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7493.html

搜索