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:查询起始时间
- 341737:电影ID
- 还有一个V不知道啥意思,不过没啥影响
其实正常来说到这儿就差不多了,按照以往的套路循环传入offset参数就好了,不过当我爬到第67页的时候,就已经不返回值了,为啥是67,67
15=1005,猫眼应该是控制了每个startTime只能往前取1000条评论,所以只能换个思路,将每页最早一条评论的时间作为startTime传入,offset固定15就好了。
-
最后效果
代码部分
- Talk is cheap. Show me the code.
# -*- coding:utf-8 -*- import requests 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 = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'} 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=15&startTime=%s'%(self.movie_id,starttime) return url def QueryComent(self,url): ''' 评论请求部分 nickName:用户昵称 cityName:城市 content:评论内容 score:用户评分 startTime:评论时间,每次取最早的时间传入下次请求 ''' time.sleep(random()) 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 '>>>>请检查网络...' print response.content.decode('utf-8') 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()
最后
评论算保存完了,近期会再做一个关于此次数据的可视化分析。另外阿汤哥真心太帅了,全程打肾上腺素,各位还没去看的赶紧~
skr~skr~~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java源码 - CyclicBarrier
开篇 CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。 CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。 CyclicBarrier的内部实现逻辑基于ReentrantLock实现,可以理解为ReentrantLock的上层应用者,通过ReentrantLock的Condtion实现线程的休眠和唤醒。 CyclicBarrier用法demo public class Test { public static void main(String[] args) { int N = 4; CyclicBarrier barrier = new CyclicBarrier(N); for(int i=0;i<N;i++) new Writer(barri...
- 下一篇
从多核硬件架构,看Java内存模型
在了解Java内存模型之前,先来看一下多核硬件架构。 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。 刚开始,还相安无事的,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作内存都要耗费很多等待时间。 所以,人们想出来了一个好的办法,就是在CPU和内存之间增加高速缓存。缓存的概念大家都知道,就是保存一份数据拷贝。他的特点是速度快,内存小,并且昂贵。 再随着市场对CPU计算能力的需要,于是出现了多核CPU,每个核都有各自的缓存。下图简单描述了多核硬件架构的实现。 现代计算机硬件,几乎都是多核处理器实现。打开Windows的任务管理器,可以核心数,还可以看到处理器的缓存。如下图红框: 可以清晰的看到L1、L2、L3三级缓存。 计算机内部的缓存架构(CPU三级缓存) 缓存大大缩小了高速CPU与低速内存之间的差距。以三层缓存架构为例: L...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范