Scrapy爬取猫眼电影评论
Scrapy爬取猫眼电影评论
文章目录
- Scrapy爬取猫眼电影评论
- 1、寻找评论接口
- 2、分析接口URL
- 接口URL规律
- 构造URL接口
- 分析JSON参数
- 3、Scrapy代码
- spiders文件
- Item文件
- piplines
- settings文件
- 4、爬取结果
- 5、Scrapy-Redis
- 修改爬虫文件
- 修改setting文件
- 进行分布式部署
目标: 地址
1、寻找评论接口
将浏览器模式从PC切换为手机
2、分析接口URL
第一个URL:http://m.maoyan.com/mmdb/comments/movie/1216446.json?_v_=yes&offset=0&startTime=0
第二个URL:http://m.maoyan.com/mmdb/comments/movie/1216446.json?_v_=yes&offset=15&startTime=2018-10-11%2015%3A19%3A05
第三个URL:http://m.maoyan.com/mmdb/comments/movie/1216446.json?_v_=yes&offset=30&startTime=2018-10-11%2015%3A19%3A05
接口URL规律
在offset
=0时,startTime
也为0,之后就是offest
每次增加15,startTime
也变为固定时间。
我们来看第一条评论(非热评)时间3分钟前,startTime
时间是2018-10-11 15:19:05
,我电脑的时间是15:22:04
所以,这个startTime
时间就是最新一条评论时间。
构造URL接口
- 1216446:表示电影id
- offset:表示偏移量
- startTime:最新一条评论的时间
我们获取最新一条评论的时间,设为固定值,然后将offset
每次便宜量增加15就成功构造该请求了。
分析JSON参数
- cmts:普通评论,每次获取15条,因为便宜量
offset
为15。 - hcmts:热门评论10条
- total:评论总数
{
"approve": 3913,
"approved": false,
"assistAwardInfo": {
"avatar": "",
"celebrityId": 0,
"celebrityName": "",
"rank": 0,
"title": ""
},
"authInfo": "",
"avatarurl": "https://img.meituan.net/avatar/7e9e9348115c451276afffda986929b311657.jpg",
"cityName": "深圳",
"content": "脑洞很大,有创意,笑点十足又有泪点,十分感动,十分推荐。怀着看喜剧电影去看的,最后哭了个稀里哗。确实值得一看,很多场景让我回忆青春,片尾的旧照片更是让我想起了小时候。",
"filmView": false,
"gender": 1,
"id": 1035829945,
"isMajor": false,
"juryLevel": 0,
"majorType": 0,
"movieId": 1216446,
"nick": "lxz367738371",
"nickName": "发白的牛仔裤",
"oppose": 0,
"pro": false,
"reply": 94,
"score": 5,
"spoiler": 0,
"startTime": "2018-08-17 03:30:37",
"supportComment": true,
"supportLike": true,
"sureViewed": 0,
"tagList": {},
"time": "2018-08-17 03:30",
"userId": 1326662323,
"userLevel": 2,
"videoDuration": 0,
"vipInfo": "",
"vipType": 0
},
- cityname:所在城市
- content:评论内容
- gender:性别
- id:评论者的id
- nickname:评论者昵称
- userlevel:评论者猫眼等级
- score:评分(满分5)
- time:评论时间
3、Scrapy代码
spiders文件
构造起始请求URL
class Movie1Spider(scrapy.Spider):name = 'movie1'allowed_domains = ['m.maoyan.com']base_url = 'http://m.maoyan.com/mmdb/comments/movie/{}.json?_v_=yes&offset={}&startTime={}'def start_requests(self):time_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')url = self.base_url.format(MOVIE_ID, 0, quote(time_now))yield Request(url=url)
从JSON
数据中获取,参数信息。
在进行爬取的时候当固定一个时间并不能一直爬取,当一个固定时间只能爬取到offset=1005
,再往后面就没数据了,当爬取到第一条评论的时候后,再往前爬取,会得到电影上映时间的评论。
所以代码终止的条件就是,当评论中的时候大于URL中的请求时间。
def parse(self, response):last_time = re.search(r'startTime=(.*)', response.url).group(1) # url中的时间response = json.loads(response.text)cmts = response.get('cmts')for cmt in cmts:global timemaoyan_item = MaoyanItem()maoyan_item['id'] = cmt.get('id')maoyan_item['nickname'] = cmt.get('nickName')maoyan_item['gender'] = cmt.get('gender')maoyan_item['cityname'] = cmt.get('cityName')maoyan_item['content'] = cmt.get('content')maoyan_item['score'] = cmt.get('score')time = cmt.get('startTime')maoyan_item['time'] = timemaoyan_item['userlevel'] = cmt.get('userLevel')if quote(time) > last_time: # 当评论的时间大于url中的时间breakyield maoyan_itemif quote(time) < last_time: # 最后一条评论小于url中的时间url = self.base_url.format(MOVIE_ID, 15, quote(time)) # 使用评论最后一条的时间yield Request(url=url, meta={'next_time': time})
Item文件
class MaoyanItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()table = 'movie'id = Field() # IDnickname = Field() # 名称gender = Field() # 性别cityname = Field() # 城市名称content = Field() # 评论内容score = Field() # 评分time = Field() # 评论时间userlevel = Field() # 评论者等级
piplines
保存信息到Mysql数据库
class MaoyanPipeline(object):def __init__(self, host, databases, user, password, port):self.host = hostself.databases = databasesself.user = userself.password = passwordself.port = port@classmethoddef from_crawler(cls, crawler):return cls(host=crawler.settings.get('MYSQL_HOST'),databases=crawler.settings.get('MYSQL_DATABASES'),user=crawler.settings.get('MYSQL_USER'),password=crawler.settings.get('MYSQL_PASSWORD'),port=crawler.settings.get('MYSQL_PORT'),)def open_spider(self, spider):try:self.db = pymysql.connect(self.host, self.user, self.password, self.databases, charset='utf8',port=self.port)self.db.ping()except:self.db = pymysql.connect(self.host, self.user, self.password, self.databases, charset='utf8',port=self.port)self.curosr = self.db.cursor()def process_item(self, item, spider):data = dict(item)keys = ','.join(data.keys())values = ','.join(['%s'] * len(data))sql = 'insert into %s (%s) values (%s)' % (item.table, keys, values)self.curosr.execute(sql, tuple(data.values()))self.db.commit()return itemdef close_spider(self, spider):self.db.close()
settings文件
适当降低爬取的延迟,以及添加Headers
,配置Mysql
的信息,开启piplines
。
BOT_NAME = 'maoyan'
SPIDER_MODULES = ['maoyan.spiders']
NEWSPIDER_MODULE = 'maoyan.spiders'
DEFAULT_REQUEST_HEADERS = {'Referer': 'http://m.maoyan.com/movie/1216446/comments?_v_=yes','User-Agent': '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'
}
ITEM_PIPELINES = {'maoyan.pipelines.MaoyanPipeline': 300,
}
MYSQL_HOST = ''
MYSQL_DATABASES = 'movie'
MYSQL_PORT =
MYSQL_USER = 'root'
MYSQL_PASSWORD = ''DOWNLOAD_DELAY = 0.1 # 每次下载请求的延迟
MOVIE_ID = '1216446' # 电影ID
4、爬取结果
5、Scrapy-Redis
由于评论过多,我们用分布式爬取的话会更快。
修改爬虫文件
- 首先需要引入RedisSpider
from scrapy_redis.spiders import RedisSpider
- 将父类继承中的
Spider
修改为RedisSpider
- 因为要从
redis
数据库中爬取链接信息,所以去掉start_urls
,并添加redis_key
。
class Movie1Spider(RedisSpider):name = 'movie1'allowed_domains = ['m.maoyan.com']base_url = 'http://m.maoyan.com/mmdb/comments/movie/{}.json?_v_=yes&offset={}&startTime={}'redis_key = 'movie1:start_urls'# def start_requests(self):# time_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')# url = self.base_url.format(MOVIE_ID, 0, quote(time_now))# yield Request(url=url)
修改setting文件
- 指定
redis
数据库链接参数:REDIS_URL - 指定
scrapy-redis
的调度器:SCHEDULER - 指定
scrapy-redis
的去重:DUPEFILTER_CLASS - 设置断点续传,不清理
redis queue
:SCHEDULER_PERSIST
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://:密码@IP:6379'
SCHEDULER_PERSIST = True
MYSQL_HOST = '地址'
MYSQL_DATABASES = 'movie'
MYSQL_PORT = 62782
MYSQL_USER = 'root'
MYSQL_PASSWORD = ''
DOWNLOAD_DELAY = 0.1 # 每次下载请求的延迟
MOVIE_ID = '1216446' # 电影ID
启动程序后,我们链接Redis
数据库,进行单机测试是否可以。
127.0.0.1:6379> lpush dytt:start_urls http://m.maoyan.com/mmdb/comments/movie/1216446.json?_v_=yes&offset=0&startTime=2018-10-11%2018%3A14%3A17
进行分布式部署
使用Gerapy批量部署
Scrapy爬取猫眼电影评论相关推荐
- scrapy爬取猫眼电影及详情页
本来是在学习matplotlib画图的,发现自己没有数据去画图光看命令效果好像不是特别大,就想着去猫眼爬点电影来画图.然后就想着刚好练习下以前学过的scrapy,然后悲剧就开始了. 整个spider的 ...
- 记第一天使用node做爬虫——爬取猫眼电影票房总榜以及指定电影的豆瓣评论前200条
首先,我是一个做前端的应届生,今天朋友想让我帮忙爬取猫眼电影票房总榜的数据,但是我之前一点都没接触过爬虫,但我还是说:okk,我试试: 然后试试就逝世,各种坑接踵而来: 提前声明:这篇文章暂时只是获取 ...
- Scrapy爬取1908电影网电影数据
Scrapy爬取1908电影网电影数据 最初是打算直接从豆瓣上爬电影数据的,但编写完一直出现403错误,查了查是豆瓣反爬虫导致了,加了headers也还是一直出现错误,无奈只能转战1908电影网了. ...
- python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程
python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程 前言 一丶整体思路 二丶遇到的问题 三丶分析URL 四丶解析页面 五丶写入文件 六丶完整代码 七丶最后 前言 大家好我是墨绿 头顶总 ...
- python猫眼电影分析_用Python 爬取猫眼电影数据分析《无名之辈》
前言 作者: 罗昭成 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e7 ...
- 利用python爬取猫眼电影,分析《大侦探皮卡丘》|凹凸数读
利用python爬取猫眼电影,分析<大侦探皮卡丘>,看看当皮卡丘长出绒毛,"丑拒"还是"真香"都在猫眼短评里了. 本文首发于微信公众号<凹凸数 ...
- python爬虫,爬取猫眼电影1(正则表达式)
本文用正则.xpath.beautifulsoup.css.pyquery几种不同的方式,爬取猫眼电影.只是记录过程.比较乱. 猫眼电影现在也添加了一些反爬虫机制,如果直接用requests可能会40 ...
- 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...
- 爬虫基本库request使用—爬取猫眼电影信息
使用request库和正则表达式爬取猫眼电影信息. 1.爬取目标 猫眼电影TOP100的电影名称,时间,评分,等信息,将结果以文件存储. 2.准备工作 安装request库. 3.代码实现 1 imp ...
最新文章
- CCNP ONT LAB之PQ WFQ
- win7-64系统安装oracle 11G客户端
- HBuilderX 自述文件
- OpenCV2:幼儿园篇 第四章 访问图像
- linux 中的MYSQL命令汇总
- 操作系统(14)Linux最常用命令(能解决95%以上的问题)
- Unity cg vertex and fragment shaders(二)
- linux tomcat 进程杀掉_Linux下启动停止查看杀死Tomcat进程
- oracle编码储存过程,oracle存储过程代码实例一
- 如何使用代理服务器更新系统_iPhone如何屏蔽iOS系统更新支持iOS12 iOS13
- 基于QT学生管理系统
- web前端新手入门:中国互联网的发展史
- 在网页中嵌入QQ聊天、阿里旺旺聊天、邮件发送等代码
- 【饥荒】关于随机地图生成的方式
- 掌门教育秉持因材施教原则,打造个性化教学模式
- 培训班出来的java程序员,怎么成为真正的技术大牛?
- 熵速率定义与各类熵的关系
- 边缘计算在自动驾驶中的应用场景丨边缘计算阅读周
- ADC外接电容:作用
- 常用在线代码转换工具
热门文章
- cGAN网络的基本实现(Mnist数字集)
- Android 全局异常捕获DefaultUncaughtExceptionHandler与Cockroach
- Conflux Studio新版教程详解
- 修复电脑蓝屏(电脑自动修复失败)
- Halcon shape_trans
- malloc如何分配内存
- c语言题库832,2017年北方民族大学计算机软件与理论832C语言程序设计与数据结构之C程序设计考研题库...
- 使用面向对象思想设计电子宠物系统
- Shell实现自动添加新行
- 见鬼,TSC 编译 TS 文件出现了‘React‘ refers to a UMD global, but the current file is a module. Consider adding