抓取电影评论数据
davies 发表于 2006 年 12 月 1 日
最近几周做了一个小项目,写个程序从某几个影片评论网站抓取评论数据,用来做影片评论与票房关系的统计分析。与直觉不同的是,它不是分析评论平均值与票房的关系,而是分析评论方差与票房的关系,评论方差对好电影与差电影的票房影响是不一样的。
所需数据分为三部分:
- 影片的基本信息和票房数据,来源于Boxofficemojo.com;
- 影片在Blog中的出现频率,来自http://www.blogpulse.com/trend;
- 影片的评论,包括分数、评论时间与长度,以www.metacritic.com为入口,再根据给出的每篇评论的链接到相应的网站上去找时间和长度信息。
说得好听点,属于数据挖掘,要从很不可靠很不规整的 Internet 上抓取想要的信息,听上去很有挑战性。说得不好听,就是一个爬虫加正则表达式,似乎没什么技术含量。实际上它们是一回事,可见包装和忽悠的重要性。
做这样的事情,正是 Python 或者 Perl 等脚本语言所擅长的,能够最直接最简便地实现想法,而不是在程序语言本身耗费太多时间。程序的性能瓶颈在网络上,因此不用担心脚本语言的性能问题。而且这种程序一旦写完,不会反复运行,大部分时间是处于不断修改过程中,也正是脚本语言所擅长地。对 Python 最熟悉,于是采用 Python 来实现,它简单直白的语法让我在大部分时候都不会碰到语法错误,而更专注于解决问题本身。用来 urllib 打开网页或者构造搜索,用 re 模块实现正则表达式匹配,time 模块解析各种格式的日期,再加上之前写过的线程池模块,差不多轮子都有了,剩下的就是进行组装和搭配。
Internet 是很不可靠的 IO,速度慢还容易出错,需要特别对待一下。我把所有下载的页面或者查询的结果都在本地做了缓存,将 URL 映射成 文件名。为了便于查看缓存,最好采用 html 作为后缀,并且 URL 和文件名有直观的对应关系。对于长度超过 255 字节的URL,不能直接作为文件名的,则用它的 md5 之类的哈希值。缓存的作用相当大,否则测试一下就要几分钟,一个月都难把程序写完。由于请求的页面特别多,最后达到了 4.3G,超过100K个文件,硬盘碎片得非常厉害。用了两级目录,打开文件夹还是非常慢。
获取影片的基本信息,需要先在 boxofficemojo.com 上查询得到该影片的页面URL,然后在该页面中提取相应数据。放映的前两天票房数据稍微麻烦一点,得根据首映日推算得到带有那几天票房数据的 URL,然后从中提取该部电影该天的数据。
Blog 趋势部分比较有意思,blogpulse.com上给出的是关键词在最近六个月的频率曲线。天啦,识别图象可不是那么容易的事情!幸运的是,曲线图上的每一个点都有链接,链接的说明文字中包含了时间和出现频率。太好了,只要用正则表达式就可以从 html 页面中提取想要的曲线数据。是不是有点 Hack 的味道?
由于好多网站都改版过,URL和页面模板都发生了变化,metacritic.com 上提供的评论链接很多都失效了,导致这一部分相当痛苦。需要构造关键字去它们的数据库中查询,并在结果页面中选择合适项目,不一定准确。
另外一个影评汇集站点http://www.rottentomatoes.com/上有更多的影评资料,如果用上面的方法仍然找不到评论时间的话,可以在该站点上找。评论基本上是影片和评论员的二维组合,如果对每个影片和每个作者都去查询的话,那是相当痛苦的。一种方法,就是把需要的某个作者的所有评论文章的日期都获取,一个页面就有 50 项数据,把它们全部保存在本地的文本文件中,等后面需要的时候直接使用。
前面说过 Internet 是很不可靠的 IO,程序应该具有多次运行以继续获取结果的能力,否则一旦出错就要重新来过的话也会很痛苦。一来是要捕捉异常,将 IO 异常和程序错误区分开来,保证在部分出错的情况下不会把所有结果都丢失。还需要差额工作,选择上次未完成的部分来继续。
网友留言:
2. 发表于 2006 年 12 月 4 日 4:56 p.m.
一点想法,可不可以在内存里面开一块做cache呢?然后将里面的结果gzip,是否能解决磁盘碎片的问题呢?
3. 发表于 2006 年 12 月 5 日 8:54 a.m.
内存cache是用来解决程序中反复使用的数据的,可是这个程序在运行过程中基本上一个 html 页面只使用一次,内存 cache 起不到作用。那些事先准备好的按作者分类的时间信息,已经做了内存 cache。
4. 发表于 2006 年 12 月 11 日 3:30 p.m.
是不是一个目录下只能放16k个文件啊?硬盘还有几个G空间但是报错说没有空间存储
5. 发表于 2006 年 12 月 11 日 7:41 p.m.
目录下的文件个数限制与文件系统有关,最好是分层的树型结构,避免一个目录下文件太多,否则会影响性能。
1. 发表于 2006 年 12 月 2 日 11:12 a.m.
很有用的信息,谢谢分享:)