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

由于评论过多,我们用分布式爬取的话会更快。

修改爬虫文件

  • 首先需要引入RedisSpiderfrom 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爬取猫眼电影评论相关推荐

  1. scrapy爬取猫眼电影及详情页

    本来是在学习matplotlib画图的,发现自己没有数据去画图光看命令效果好像不是特别大,就想着去猫眼爬点电影来画图.然后就想着刚好练习下以前学过的scrapy,然后悲剧就开始了. 整个spider的 ...

  2. 记第一天使用node做爬虫——爬取猫眼电影票房总榜以及指定电影的豆瓣评论前200条

    首先,我是一个做前端的应届生,今天朋友想让我帮忙爬取猫眼电影票房总榜的数据,但是我之前一点都没接触过爬虫,但我还是说:okk,我试试: 然后试试就逝世,各种坑接踵而来: 提前声明:这篇文章暂时只是获取 ...

  3. Scrapy爬取1908电影网电影数据

    Scrapy爬取1908电影网电影数据 最初是打算直接从豆瓣上爬电影数据的,但编写完一直出现403错误,查了查是豆瓣反爬虫导致了,加了headers也还是一直出现错误,无奈只能转战1908电影网了. ...

  4. python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程

    python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程 前言 一丶整体思路 二丶遇到的问题 三丶分析URL 四丶解析页面 五丶写入文件 六丶完整代码 七丶最后 前言 大家好我是墨绿 头顶总 ...

  5. python猫眼电影分析_用Python 爬取猫眼电影数据分析《无名之辈》

    前言 作者: 罗昭成 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e7 ...

  6. 利用python爬取猫眼电影,分析《大侦探皮卡丘》|凹凸数读

    利用python爬取猫眼电影,分析<大侦探皮卡丘>,看看当皮卡丘长出绒毛,"丑拒"还是"真香"都在猫眼短评里了. 本文首发于微信公众号<凹凸数 ...

  7. python爬虫,爬取猫眼电影1(正则表达式)

    本文用正则.xpath.beautifulsoup.css.pyquery几种不同的方式,爬取猫眼电影.只是记录过程.比较乱. 猫眼电影现在也添加了一些反爬虫机制,如果直接用requests可能会40 ...

  8. 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...

  9. 爬虫基本库request使用—爬取猫眼电影信息

    使用request库和正则表达式爬取猫眼电影信息. 1.爬取目标 猫眼电影TOP100的电影名称,时间,评分,等信息,将结果以文件存储. 2.准备工作 安装request库. 3.代码实现 1 imp ...

最新文章

  1. CCNP ONT LAB之PQ WFQ
  2. win7-64系统安装oracle 11G客户端
  3. HBuilderX 自述文件
  4. OpenCV2:幼儿园篇 第四章 访问图像
  5. linux 中的MYSQL命令汇总
  6. 操作系统(14)Linux最常用命令(能解决95%以上的问题)
  7. Unity cg vertex and fragment shaders(二)
  8. linux tomcat 进程杀掉_Linux下启动停止查看杀死Tomcat进程
  9. oracle编码储存过程,oracle存储过程代码实例一
  10. 如何使用代理服务器更新系统_iPhone如何屏蔽iOS系统更新支持iOS12 iOS13
  11. 基于QT学生管理系统
  12. web前端新手入门:中国互联网的发展史
  13. 在网页中嵌入QQ聊天、阿里旺旺聊天、邮件发送等代码
  14. 【饥荒】关于随机地图生成的方式
  15. 掌门教育秉持因材施教原则,打造个性化教学模式
  16. 培训班出来的java程序员,怎么成为真正的技术大牛?
  17. 熵速率定义与各类熵的关系
  18. 边缘计算在自动驾驶中的应用场景丨边缘计算阅读周
  19. ADC外接电容:作用
  20. 常用在线代码转换工具

热门文章

  1. cGAN网络的基本实现(Mnist数字集)
  2. Android 全局异常捕获DefaultUncaughtExceptionHandler与Cockroach
  3. Conflux Studio新版教程详解
  4. 修复电脑蓝屏(电脑自动修复失败)
  5. Halcon shape_trans
  6. malloc如何分配内存
  7. c语言题库832,2017年北方民族大学计算机软件与理论832C语言程序设计与数据结构之C程序设计考研题库...
  8. 使用面向对象思想设计电子宠物系统
  9. Shell实现自动添加新行
  10. 见鬼,TSC 编译 TS 文件出现了‘React‘ refers to a UMD global, but the current file is a module. Consider adding