最近几天,有部国产电影因好评及口碑传播而开始异军突起以黑马之势逆袭,在朋友圈以及微博上都会不时看到相关内容,那便是由陈建斌、任素汐等主演的《无名之辈》。这样一部没有什么特别大牌或流量明星,甚至名称与海报都没有什么特色的国产电影却引起了很多人的注意,更是在评分上直接将同期的如《毒液》、《神奇动物:格林德沃之罪》给 PK 了下去。这部剧从 16 日上映到现在,豆瓣评分 8.3 分,其中 5 星好评占 34.8%,而在猫眼上好评则直接超过了 50%。看这个数据,还是一部不错的国产剧。在一个貌似平常的日子,笔者用着一台低配的 Mac 电脑跑了一下《无名之辈》猫眼的评论数据,来看看这部小成本喜剧片究竟值不值得看。


需要特别说明一下,为什么要用猫眼的数据,而不用豆瓣的?主要还是因为豆瓣是直接渲染的 HTML,而猫眼的数据是 JSON,处理起来比较方便。

获取猫眼接口数据

作为一个长期宅在家的程序员,对各种抓包简直是信手拈来。在 Chrome 中查看原代码的模式,可以很清晰地看到接口,接口地址即为:

在 Python 中,我们可以很方便地使用 request 来发送网络请求,进而拿到返回结果:

def getMoveinfo(url): session = requests.Session() headers = { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)" } response = session.get(url, headers=headers) if response.status_code == 200: return response.text return None

根据上面的请求,我们能拿到此接口的返回数据,数据内容有很多信息,但有很多信息是我们并不需要的,先来总体看看返回的数据:

{ "cmts":[ { "approve":0, "approved":false, "assistAwardInfo":{ "avatar":"", "celebrityId":0, "celebrityName":"", "rank":0, "title":"" }, "authInfo":"", "cityName":"贵阳", "content":"必须十分,借钱都要看的一部电影。", "filmView":false, "id":1045570589, "isMajor":false, "juryLevel":0, "majorType":0, "movieId":1208282, "nick":"nick", "nickName":"nickName", "oppose":0, "pro":false, "reply":0, "score":5, "spoiler":0, "startTime":"2018-11-22 23:52:58", "supportComment":true, "supportLike":true, "sureViewed":1, "tagList":{ "fixed":[ { "id":1, "name":"好评" }, { "id":4, "name":"购票" } ] }, "time":"2018-11-22 23:52", "userId":1871534544, "userLevel":2, "videoDuration":0, "vipInfo":"", "vipType":0 } ]}

如此多的数据,我们感兴趣的只有以下这几个字段:

nickName, cityName, content, startTime, score

接下来,进行我们比较重要的数据处理,从拿到的 JSON 数据中解析出需要的字段:

def parseInfo(data): data = json.loads(html)['cmts'] for item in data: yield{ 'date':item['startTime'], 'nickname':item['nickName'], 'city':item['cityName'], 'rate':item['score'], 'conment':item['content'] }

拿到数据后,我们就可以开始数据分析了。但是为了避免频繁地去猫眼请求数据,需要将数据存储起来,在这里,笔者使用的是 SQLite3,放到数据库中,更加方便后续的处理。存储数据的代码如下:

def saveCommentInfo(moveId, nikename, comment, rate, city, start_time) conn = sqlite3.connect('unknow_name.db') conn.text_factory=str cursor = conn.cursor() ins="insert into comments values (?,?,?,?,?,?)" v = (moveId, nikename, comment, rate, city, start_time) cursor.execute(ins,v) cursor.close() conn.commit() conn.close()

数据处理