第一步

打开一个电影的评论界面:

哪吒之魔童降世:https://maoyan.com/films/1211270

我们发现这里只显示10条评论,而我们需要爬取10w条数据,所以不能从此页面进行抓包,所以放弃!!!!

于是又上网查,终于看到一篇文章说到开发者模式可以直接切换到手机模式;

第二步

切换开发者模式为手机模式

切换模式后可以看到所有评论都显示出来了,我们可以直接抓包进行分析

第三步

点击查看全部讨论

开发者工具切换切换XHR,然后一直下滑查看评论

每条请求所对应的数据

http://m.maoyan.com/review/v2/comments.json?movieId=1211270&userId=-1&offset=15&limit=15&ts=1564996441232&type=3

# movieId       表示电影ID
# offset 表示偏移量
# limit 一页显示多少数据
# ts 当前时间戳

通过多次下滑观察可以看到每次都是offset在变化,而且每次加15,也就是增加15条评论,知道了这个规律其实大家都应该会做了,但是还有个问题,这个方法只能爬取1000条数据,除非改变时间戳,也就是ts,

第四步

我们在上面的方法基础上改变时间戳后发现也只能爬取1000条数据,我们只能另寻他法;

于是我们通过百度知道了有另外一个api可以获得猫眼电影的评论数据

http://m.maoyan.com/mmdb/comments/movie/1211270.json?_v_=yes&offset=0&startTime=2019-08-04%2018:18:53
# 只需要改变startTime,根据时间段来获取评论数据
# 每次获取的评论数据还是15条

查看每页中最后一条数据的startTime

根据上面的原理我们制定爬取方案:
因为我们请求网页所得到的响应数据只用15条,且可以获取到最后一条数据的startTime; 第一次请求url中的startTime我们用当前时间,并获取响应数据中最后一条数据的startTime;
第二次请求时我们将时间替换为第一次请求时响应数据中最后一条数据的startTime,依次类推
直到时间为电影的上映时间即可获取该部电影的所有评论数据;
from pymongo import MongoClient

my_client = MongoClient("127.0.0.1",27017)

MDB = my_client["Movie_rating"]   # 指定连接电影评分的库名

print(MDB.Movie_comment.find({}).count())  # 查看表中一共有多少条数据

指定存储数据库

import time
import random
import datetime
import requests
from mongo_db import MDB # 获取当前时间转换为2019/8/5 17:31:15形式空格用%20替换
now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S').replace(' ','%20') headers = {
'Host': 'm.maoyan.com',
'Referer': 'http://m.maoyan.com/movie/1211270/comments?_v_=yes',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36',
'X-Requested-With': 'superagent',
} time.sleep(random.random()) # 从当前时间往前爬取2000个url的数据,每个url有15条数据
for num in range(1,2000):
url = "http://m.maoyan.com/mmdb/comments/movie/1211270.json?_v_=yes&offset=0&startTime={}".format(now_time)
print("正在下载第{}条评论".format(num))
response = requests.get(url).json()
# 每页的最后一条评论的时间,每次请求后给全局的now_time重新赋值,下次请求时用的时间就是上次响应数据中的最后一条数据的时间
now_time = response["cmts"][-1]["startTime"]
for movie_info in response["cmts"]:
cityName = movie_info["cityName"]
content = movie_info["content"]
user_id = movie_info["id"]
nickName = movie_info["nickName"]
movieId = movie_info["movieId"]
gender = movie_info.get("gender")
if not gender:
gender = "暂无" comment_info = {"cityName":cityName,"nickName":nickName,"user_id":user_id,"movieId":movieId,"gender":gender,"content":content}
# 因为我们创建了唯一索引,所以我们在插入数据时如果有重复的会报错,这里做了异常处理
try:
MDB.Movie_comment.insert_one(comment_info)
except Exception as e:
print(e)
print("所有评论下载完成")

数据下载地址:https://files.cnblogs.com/files/songzhixue/%E7%8C%AB%E7%9C%BC%E7%94%B5%E5%BD%B13w%E6%9D%A1%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.rar

共计3w评论下载完成后导入mongodb数据库

时间转换地址:http://tool.chinaz.com/Tools/unixtime.aspx

爬虫之获取猫眼电影10W评论的更多相关文章

  1. 爬虫实战【4】Python获取猫眼电影最受期待榜的50部电影

    前面几天介绍的都是博客园的内容,今天我们切换一下,了解一下大家都感兴趣的信息,比如最近有啥电影是万众期待的? 猫眼电影是了解这些信息的好地方,在猫眼电影中有5个榜单,其中最受期待榜就是我们今天要爬取的 ...

  2. 利用多进程获取猫眼电影top100

    猫眼电影top100 是数据是在加载网页时直接就已经加载了的,所以可以通过requests.get()方法去获取这个url的数据,能过对得到的数据进行分析从而获得top100的数据, 把获取的数据存入 ...

  3. Python3编写网络爬虫04-爬取猫眼电影排行实例

    利用requests库和正则表达式 抓取猫眼电影TOP100 (requests比urllib使用更方便,由于没有学习HTML系统解析库 选用re) 1.目标 抓取电影名称 时间 评分 图片等 url ...

  4. kettle 利用 HTTP Client 获取猫眼电影API近期上映相关信息,并解析json

    前言 Kettle 除了常规的数据处理之外,还可以模拟发送HTTP client/post ,REST client. 实验背景 这周二老师布置了一项实验: 建立一个转换,实现一个猫眼API热映电影的 ...

  5. python3爬虫爬取猫眼电影TOP100(含详细爬取思路)

    待爬取的网页地址为https://maoyan.com/board/4,本次以requests.BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名.图片.名称.演 ...

  6. <scrapy爬虫>爬取猫眼电影top100详细信息

    1.创建scrapy项目 dos窗口输入: scrapy startproject maoyan cd maoyan 2.编写item.py文件(相当于编写模板,需要爬取的数据在这里定义) # -*- ...

  7. requests + 正则表达式 获取 ‘猫眼电影top100’。

    使用 进程池Pool 提高爬取数据的速度. 1 # !/usr/bin/python 2 # -*- coding:utf-8 -*- 3 import requests 4 from request ...

  8. python 爬取猫眼电影top100数据

    最近有爬虫相关的需求,所以上B站找了个视频(链接在文末)看了一下,做了一个小程序出来,大体上没有修改,只是在最后的存储上,由txt换成了excel. 简要需求:爬虫爬取 猫眼电影TOP100榜单 数据 ...

  9. Requests+正则表达式 爬取猫眼电影

    代码: import re import json from multiprocessing import Pool import requests from requests.exceptions ...

随机推荐

  1. 洛谷 P1217 回文质数

    洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...

  2. javascript 之 扩展对象 Object.assing

    语法:Object.assign(target,...source) 说明:Object.assign方法的第一个参数是目标对象,后面的参数都是源对象 一.以对象为参数的合并 1.第一个参数都是对象, ...

  3. 2019年全国高校sql数据库

    2019年全国高校名单sql数据库信息: 根据教育部发布的文件整理形成可用.sql文件,导入数据库即可使用. 包括全国高等学校共计2956所,其中:普通高等学校2688所(含独立学院257所),成人高 ...

  4. 浅谈javascript中变量作用域和内存(2)

    1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...

  5. windows下oracle数据库报错ORA-12705解决方法

    转自:http://blog.sina.com.cn/s/blog_16eaf6b940102x66q.html 有个朋友,他们那边windows虚拟机重启后,数据库不能起来报错ORA-12705无法 ...

  6. List集合和Set集合互转

    List集合转成Set集合(如果List集合的元素有重复,转成Set集合就会去掉重复的数据,每条数据只保留一条) //List转化成Set List<String> list = new ...

  7. CentOS7.X+LAMP环境下安装zabbix4.X

    1.安装zabbix仓库 rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noar ...

  8. Go语言中的IO操作、Flag包以及urfave/cli命令行框架

    一.格式化输入和输出 1.从终端获取用户的输入 fmt.Scanf  空格作为分隔符,占位符和格式化输出的一致 fmt.Scan  从终端获取用户的输入,存储在Scanln中的参数里,空格和换行符作为 ...

  9. SpringBoot自动配置的魔法是怎么实现的

    SpringBoot 最重要的功能就是自动配置,帮我们省去繁琐重复地配置工作.相信用过SpringBoot的人,都会被它简洁的步骤所惊讶.那么 SpringBoot 是如何实现自动配置的呢? 在这之前 ...

  10. Jmeter+Jenkins持续集成(一、环境准备)

    1.安装JDK (1)下载JDK,jdk8u181-x64.dmg 并进行安装 (2)配置环境变量.打开配置文件 open -e .bash_profile.按照自己的安装路径进行配置. JAVA_H ...