爬取猫眼十万条评论数据

爬取猫眼十万条评论数据

写在之前

我之前看了一些关于抓包的文章,还以为猫眼的接口都要通过fiddler去抓包,但是我错了,fiddler出了点问题,后来用夜神模拟器去模拟手机,但是一直抓不到想要的包,于是又上网查,终于看到一篇文章说到开发者模式可以直接切换到手机模式

第一步

进入猫眼官网,找到一部电影,或者直接点开链接https://maoyan.com/films/248123

第二步

按下手机模式这个按钮,然后!!!必须再按F5刷新一次,然后就会变成手机模式,只有在手机上才会显示评论数的!!!

第三步

点击查看全部32567条评论,然后一直下滑查看评论,并且要点切换XHR,只看XHR格式文件,不然数据难找,最后找到comment.json,offset这个文件

第四步

查看这个文件的headers,得到URL:http://m.maoyan.com/review/v2/comments.json?movieId=248123&userId=-1&offset=15&limit=15&ts=1555246486297&type=3

通过多次下滑观察可以看到每次都是offset在变化,而且每次加15,也就是增加15条评论

第五步

知道第四步的规律其实大家都应该会做了,但是还有个问题,这个方法只能爬取1000条数据,除非改变时间戳,也就是ts,

ts是对时间的一个表述形式,而我们点击上面的json文件,使用json解析,百度一下就知道json解析的网页了,解析后发现存在一个startTime

startTime也是对时间的一个表述,那么我们就打开这个网页:http://tool.chinaz.com/Tools/unixtime.aspx

把内容切换为北京时间,可以看到ts对应的是当前时间,于是我们尝试访问http://m.maoyan.com/review/v2/comments.json?movieId=248123&userId=-1&offset=15&limit=15&startTime=你的当前时间&type=3

但是要注意对时间进行转换,空格对应的是%20,冒号对应的是%3A

我们发现行得通,于是代码思路就来了!!

第六步:

首先得到当前时间和电影上映时间,每次访问URL都获取json中最后一个数据的startTime,当遍历完前1000条数据后,更新URL,改变startTime为最后一条数据的URL,

知道startTime小于上映时间为止

最后加上源码:

import pymysql as pm
import json
import time
import requests
#网页版猫眼只能显示热门短评,只有手机版app才能显示所有评论,所以抓包关键
# 建立数据库
db = pm.connect(host='localhost', user='root', password='123456', db='lianjia')
# 声明游标
cursors = db.cursor()
sql = 'insert into maoyan_data(date,city,score,comment,nick) values(%s,%s,%s,%s,%s)'

for i in range(0,10):
         time.sleep(2)
         #offset不应该每次递增1次,因为每页有15条短评,而且第二页跟第一页只有一条短评不一样!
         url ='http://m.maoyan.com/mmdb/comments/movie/1235560.json?_v_=yes&offset='+ str(i*15)
         #这是评论网页地址,1235560是电影白蛇缘起的id
         html = requests.get(url).content
         #获得内容
         data = json.loads(html.decode('utf-8'))['cmts']#获得cmts内的内容
         # print(data)
         #loads方法是把json对象转化为python对象
         for item in data:
               tomato=({'date':item['time'].split(' ')[0],'city':item['cityName'],
                            'score':item['score'],'comment':item['content'],
                            'nick':item['nick']})#可以帮助忽略index,自动递增

               #注意!comment和Nick应该使用utfmd4字符集,因为可能出现表情符号!
               params = (tomato["date"], tomato["city"], tomato["score"], tomato["comment"], tomato["nick"])
               cursors.execute(sql, params)
               # commit是把查询语句提交到数据库内
               db.commit()
db.close()



由于我之前在博客园写过这篇,只是为了赚积分才重写,所以有兴趣的朋友可以去博客园看我的原文,有图片
链接: https://www.cnblogs.com/fodalaoyao/p/10707080.html](https://mp.csdn.net).

你可能感兴趣的:(爬虫)