Python爬取猫眼「碟中谍」全部评论

实现目标

  • 昨天晚上看完碟中谍后,有点小激动,然后就有了这片文章。
  • 我们将猫眼上碟中谍的全部评论保存下来,用于后期分析~
  • 总共评论3W条左右。

逻辑梳理

  • 猫眼PC网页只能查看热门评论,只有在手机端页面才能查看全部评论。我们用chrome手机模式打开碟中谍6的页面,然后找到了全部评论入口:
  • 当我们将评论页面向上拖,后台请求中变看到了我们想要的接口地址:http://m.maoyan.com/mmdb/comments/movie/341737.json?_v_=yes&offset=15&startTime=2018-09-02%2013%3A33%3A14
  • 请求地址中的参数: offset:偏移量 startTime查询起始时间 还有一个V不知道啥意思,不过没啥影响
  • 其实正常来说到这儿就差不多了,按照以往的套路循环传入offset参数就好了,不过当我爬到第67页的时候,就已经不返回值了,为啥是67,67$\times$15=1005,猫眼应该是控制了每个startTime只能往前取1000条评论,所以只能换个思路,将每页最早一条评论的时间作为startTime传入,offset固定15就好了。
  • 最后效果

代码部分

  • Talk is cheap. Show me the code.
# -*- coding:utf-8 -*-
import requests
import json
from datetime import datetime
import time
from tqdm import tqdm
from random import random

class MaoYan():
	"""docstring for ClassName"""
	def __init__(self, movie_id):
		print '*******MaoYan_spider******'
		print 'Author :     Awesome_Tang'
		print 'Date   :       2018-09-01'
		print 'Version:        Python2.7'
		print '**************************\n'
		self.movie_id = movie_id
		self.starttime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
		self.starturl = 'http://m.maoyan.com/mmdb/comments/movie/%s.json?_v_=yes&offset=0&startTime=%s'%(movie_id,self.starttime)
		self.headers = {'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'}
	
	def GetCommentNum(self):
		'''
		查询总评论数
		用于建立循环
		'''
		response = requests.get(self.starturl,headers = self.headers)
		text = response.json()
		num = text['total']
		print '>>>>查询时间:%s\n>>>>评论数量:%s'%(self.starttime,num)
		return num

	def FormatUrl(self,starttime):
		url = 'http://m.maoyan.com/mmdb/comments/movie/%s.json?_v_=yes&offset=30&startTime=%s'%(self.movie_id,starttime)
		return url

	def QueryComent(self,url):
		'''
		评论请求部分
		nickName:用户昵称
		cityName:城市
		content:评论内容
		score:用户评分🌟🌟
		startTime:评论时间,每次取最早的时间传入下次请求
		'''
		try:	
			response = requests.get(url, headers = self.headers, timeout = 5)
			if response.status_code == 200:
				attrs = ''
				comments = response.json()['cmts']
				for index in range(15):
					try:
						nickName = comments[index]['nickName']
						cityName = comments[index]['cityName']
						content = comments[index]['content']
						score = comments[index]['score']
						startTime = comments[index]['startTime']
						param = '%s|%s|%s|%s|%s\n'%(startTime,nickName,cityName,score,content)
						attrs = attrs+param
					except KeyError as e:
						attrs = ''		
				return attrs ,startTime, True
			else:
				print '>>>>查询过于频繁,请休息几分钟♨️♨️'
				return response.content.encode('utf-8'),'',False
		except BaseException as e:
			print '>>>>请检查网络...🔗🔗\n'
			print e.message
			return e.message,'',False

	def SaveComent(self):
		'''
		保存评论到txt文件
		如果请求成功保存,失败sleep100秒
		tqdm用于实现进度条
		'''
		num = self.GetCommentNum()
		pages = num/15
		with open('comment.txt','a+') as f:
			for i in tqdm(range(pages)):
				if i == 0:
					starttime = self.starttime
					url = self.FormatUrl(starttime)
					attrs,starttime,IsOk = self.QueryComent(url)
				else:
					url = self.FormatUrl(starttime)
					attrs,starttime,IsOk = self.QueryComent(url)
				if IsOk:
					f.write(attrs.encode('utf-8'))
				else:
					while True:
						time.sleep(100)
						attrs,starttime,IsOk = self.QueryComent(url)
						if IsOk:
							f.write(attrs.encode('utf-8'))
							break
						else:
							continue
			print '>>>>评论保存完毕...'



if __name__ == '__main__':
	p = MaoYan('341737')
	p.SaveComent()

最后

评论算保存完了,近期会再做一个关于此次数据的可视化分析。另外阿汤哥真心太帅了,全程打肾上腺素,各位还没去看的赶紧~

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小詹同学

同样是追星 ,他们是这样做的 。

最近我朋友疯狂迷恋韩国的偶像团体防弹少年团,于是拜托我帮忙写一段程序实时检测韩国新闻网站instiz旗下两个板块pt和clip,当出现自家idol的新闻时,程序...

1466
来自专栏coding

听说,撸代码,ide与vim更配哦vim折腾记vim常用命令

在选择编辑器上面,我是一个纠结的人,曾经年少的我执着地追求一款万能的编辑器,可以支持所有编辑语言,灵活可定制,可纯粹用键盘操作。符合这种条件的编辑器,非vim莫...

1002
来自专栏哲学驱动设计

产品前端重构(TypeScript、MVC框架设计)

最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容。 公司期望把某一管理类信息系统从项目代码中抽取、重构为一个可复用的产品。该系统的...

2598
来自专栏程序猿DD

极大提高工作效率的几十种神兵利器

来源:https://www.liutf.com/posts/3720794851.html

2183
来自专栏androidBlog

360面试总结(Android)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

871
来自专栏自然语言处理

微博话题爬取与存储分析(上)

本文基于python以新浪微博为数据平台,从数据采集、关键字提取、数据存储三个角度,用最简单的策略来挖掘我们的“黄金”。

3492
来自专栏张善友的专栏

在你的网站集成Wiki系统 WikiPlex

Wikiplex 是一种在 .NET Framework 上所开发,具有处理 Wiki 编辑宏功能的小型函式库组件,它提供了数种编辑样式的格式,以让使用者可以类...

2208
来自专栏Linyb极客之路

我珍藏的神兵利器 - 效率工具

快速启动应用+文件搜索+各种实用插件(计算器、翻译、网页快速访问等)。我的最爱,没有它我几乎半残。

2254
来自专栏小樱的经验随笔

深入理解USB流量数据包的抓取与分析

在一次演练中,我们通过wireshark抓取了一个如下的数据包,我们如何对其进行分析?

3442
来自专栏ionic3+

【技巧】ionic3自动聚焦暴力实现

很早前和群里的人探讨过自动聚焦,在android上可以,但是在ios上失败,后来在网上看到这个:

842

扫码关注云+社区

领取腾讯云代金券