吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4261|回复: 8
收起左侧

[Python 转载] 【爬虫】爬行豆瓣电影短评

  [复制链接]
c0ld 发表于 2019-7-13 20:47
本帖最后由 c0ld 于 2019-7-13 20:49 编辑

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

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

目前脑海中就只记得这两个问题了,如果后续想起来还有其他问题再进行补充
首先对于第一个问题出现的原因就在于 我是通过OCR文字识别从海报中提取的电影名称
意为在现阶段我们只有一个电影名称的变量,在遇到这个问题的时候我的第一反应便是看看豆瓣电影详情页的URL,是否有规律可寻
下面贴上两部电影详情页的URL:
1.jpg 2.jpg
通过以上图片我们可以观察到电影详情页的URL构成重点在于subject/后的电影编号上,但是我们发现这个编号没啥什么卵子规律,暂时放下获取电影编号的想法
于是我的方向重新放在了搜索页面,搜索页面中是存在电影详情页的URL超链接的,就像这样:
3.jpg
那一瞬间的我错认为问题已经被解决,当我准备分析页面结构时,我又重新回到了起点:
4.jpg
豆瓣在搜索页面使用了Ajax渲染技术,这种技术利用JavaScript在保证页面不被刷新,页面链接不改变的情况下与服务器交换数据并更新部分网页
意为在原页面中嵌入JavaScript脚本,通过该脚本来在原页面中拼接数据内容,像是这样:
5.jpg
我们爬虫此时爬行到的网页数据只是基本框架,并没有爬行到我们想要的数据,那么我们的解决方案有以下两种:
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

可以看到这个API中返回的数据由我们想要的电影编号(就是表中的电影ID) 7.jpg
那么我们的问题便迎刃而解
总结一下我们最后的编程思路:
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

免费评分

参与人数 3吾爱币 +7 热心值 +3 收起 理由
lishixin23 + 1 + 1 热心回复!
wi5101 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wi5101 发表于 2019-7-13 22:27
刚巧,最近也在琢磨这些玩意。让人头秃
Cynthia94 发表于 2019-7-13 23:18
这个教程非常不错,支持一下。
楼主可以尝试异步了。
豆小果 发表于 2019-7-14 11:54
 楼主| c0ld 发表于 2019-7-14 17:47
豆小果 发表于 2019-7-14 11:54
这个api是不是不能用了

那个是正常返回的JSON数据,你在参数里填写参数就行了
豆小果 发表于 2019-7-15 11:14
c0ld 发表于 2019-7-14 17:47
那个是正常返回的JSON数据,你在参数里填写参数就行了

测试返回的数据不对 微信截图_20190715111051.png
微信截图_20190715111051.png
 楼主| c0ld 发表于 2019-7-15 14:20
豆小果 发表于 2019-7-15 11:14
测试返回的数据不对

apikey申请地址 https://www.idataapi.cn/t/gfabcfo
豆小果 发表于 2019-7-16 10:46
c0ld 发表于 2019-7-15 14:20
apikey申请地址 https://www.idataapi.cn/t/gfabcfo

好的,我试试!
豆小果 发表于 2019-7-16 10:51

豆瓣api好像下线了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 11:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表