设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 25134|回复: 21
打印 上一主题 下一主题

「一道大数据习题」豆瓣评论最多的三千部电影

[复制链接]
回帖奖励 21 金钱 回复本帖可获得 3 金钱奖励! 每人限 1 次

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-10-17 17:33:32 |只看该作者 |倒序浏览
现在到处都说“大数据”,我也跟着标题党一下。今天要说的这个,还算不上大数据,只能说跟以前的习题相比,数据量略大了一点。

前阵子我们做了个抓取热映电影的程序。有个朋友看到了就说,他正好需要一项数据:豆瓣上的电影按评价人数从高到底排序。他认为,单是评分高低并不能说明一部电影的受关注度,比如有些分超低的奇葩大烂片照样火得很。但豆瓣本身并没有提供类似的功能。所以他想找我帮忙。我说你要排出多少?他说三千部。我说你这是要开录像厅吗!一天看一部也得看个八、九年。他说这你甭管,我这是要用来做观影决策参考的。

我想了想,觉得这事也不是太难搞定,只是有些复杂,要处理几个问题。不过这倒是一个用来练手的好题目。于是秉着授人以鱼不如授人以渔的原则,我决定把这个问题整理一下,抛给大家。

问题描述:
抓取豆瓣上的电影,按评价人数从高到低排序,列出前3000部。
每部电影显示名称、评价人数、豆瓣评分、豆瓣链接。

问题分析:
基本思路是:1.抓下所有的电影;2.按评价人数排序

然而豆瓣上并没有提供“所有电影”这样一个列表,也没有一个全覆盖的分类,有的只是:标签。

http://movie.douban.com/tag/?view=type

这个页面就是豆瓣的标签页面,上面列出了常用的标签。但一个电影可能有很多个标签,也可能不含有这里列出的标签。另外我尝试了下,每个标签只能显示前50页也就是1000部电影。

所以我想到的方法就是:先抓取这个页面上的所有标签,然后进入每个标签页的前50页抓取电影列表。我们要的信息列表页上都已经有了,不用再进入影片页面。但在记录电影的时候,需要去除重复。已经记录下的电影就不再重复记录。这个操作可以在抓取的时候进行,也可以先全部抓取,再去重。

这样做其实未必能抓到所有电影,不过对于我们这种精确度不需要很高的需求来说,应该足够了。

得到所有影片的信息之后,接下来排序就比较容易了。Python中提供了sort方法。但这里可能遇到的问题是,影片数量太多,导致读写和排序都很慢。一个供参考的优化方法是:在抓取的时候就分段存储,预先给评价人数设定一些值,按这些值来存储不同级别的电影。最后排序的时候可以每一段分别排序,而如果高评价人数的电影已经超过三千部,就无需再排后面的影片。

结果展示:
最后的结果建议保存成一个html文件,并且把影片的豆瓣地址做成链接。这样在浏览器中查看的时候,就可以直接链接到对应的豆瓣页面上。

你还可以增加一些数据统计,比如评价人数的分布,评分的分布,评价人数与评分的关系等。对web开发熟悉的同学,甚至可以把这些数据做成一个小网站,用来对豆瓣电影进行多维的搜索排序,成为一个个性化的电影推荐应用。

题外话:
前面提到,这样可能也无法抓到所有电影。一种更全面的方法是,在数据库里维护标签和影片的数据,然后从每部电影的标签和相关电影中不断寻找没有抓过的标签和电影,递归地抓取。但这样做,消耗的时间是远远超出现在的方法。

知乎上有个问题:“豆瓣有多少部电影?”。有人用抽样统计的方法推算出大约在2万部左右,但加上各种短片、动画、广告片,可能有几十万。做完这个程序,你也可以对这个问题有一个自己的答案。

上次讲了抓天气的程序之后,天气网的接口就有些不稳定了。希望这次不会给豆瓣带来压力。


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2013-10-18 00:00:50 |只看该作者
再给另一个解决方案:
通过豆瓣的电影api
http://developers.douban.com/wiki/?title=movie_v2
顺着id一个个试过去
但是不知道会不会有访问限制。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

161

积分

注册会员

Rank: 2

板凳
发表于 2013-10-24 01:02:20 |只看该作者

回帖奖励 +3 金钱

crossin先生 发表于 2013-10-18 00:00
再给另一个解决方案:
通过豆瓣的电影api
http://developers.douban.com/wiki/?title=movie_v2

貌似调试程序的时候悲催了,被HTTP Error 403: Forbidden了……是不是请求太多次了
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2013-10-24 12:53:28 |只看该作者
jxgx072037 发表于 2013-10-24 01:02
貌似调试程序的时候悲催了,被HTTP Error 403: Forbidden了……是不是请求太多次了 ...

hoho... 感觉是的。是api返回403?直接上豆瓣是好的?
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

161

积分

注册会员

Rank: 2

5#
发表于 2013-10-24 17:24:21 |只看该作者
本帖最后由 jxgx072037 于 2013-10-24 17:28 编辑
crossin先生 发表于 2013-10-24 12:53
hoho... 感觉是的。是api返回403?直接上豆瓣是好的?

没用API那种方法,直接抓豆瓣电影页面上的内容,在shell里面显示403,直接访问是好的~~~哈哈……大半夜的各种换VPN
回复

使用道具 举报

2

主题

0

好友

161

积分

注册会员

Rank: 2

6#
发表于 2013-10-25 02:55:28 |只看该作者
本帖最后由 jxgx072037 于 2013-10-25 03:02 编辑

目前搞出来一个理论上可行的版本,这个版本在抓取豆瓣电影时会出现请求过多,被豆瓣屏蔽的现象……采取的方法是直接上他的页面抓取信息,因为目前能抓到的信息不多,所以排序上面没下太多功夫……就用了一个sort;

这里是根据仅抓取的几个标签生成的前100部电影;

代码在这里

求拍砖!!

403.png
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2013-10-25 09:51:45 |只看该作者
jxgx072037 发表于 2013-10-25 02:55
目前搞出来一个理论上可行的版本,这个版本在抓取豆瓣电影时会出现请求过多,被豆瓣屏蔽的现象……采取的方 ...

厦大登山协会v5...
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2013-10-25 09:57:32 |只看该作者
jxgx072037 发表于 2013-10-25 02:55
目前搞出来一个理论上可行的版本,这个版本在抓取豆瓣电影时会出现请求过多,被豆瓣屏蔽的现象……采取的方 ...

被屏蔽是个问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

161

积分

注册会员

Rank: 2

9#
发表于 2013-10-25 10:15:25 |只看该作者
crossin先生 发表于 2013-10-25 09:51
厦大登山协会v5...

嘿嘿,暂时找不到空间放网页,就先借俺们协会的空间用一下啦……有机会到厦门可以来玩

关于屏蔽,目前想到可以设置一下定时,比如每隔5s抓取一部……但是这样的话会变慢……
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2013-10-25 11:25:11 |只看该作者
jxgx072037 发表于 2013-10-25 10:15
嘿嘿,暂时找不到空间放网页,就先借俺们协会的空间用一下啦……有机会到厦门可以来玩

关于屏蔽,目前 ...

去过两次厦大,今年1月份刚去了次,校园很美!

这个屏蔽是暂时的吗?如果每个tag抓一次,然后把记录保存。一旦遇到屏蔽就停止,歇一段时间继续接着抓,这样可行吗?
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-3 17:05 , Processed in 0.025880 second(s), 31 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部