近期【诛仙】电影评论如潮,有褒有贬。我们现在针对此电影进行用户评论信息的爬取,并进行数据的分析。
由于猫眼电影评论数据是动态加载的,所以我们我们不可能通过requests直接请求电影页面进行获取,现在必须找到相应的接口,从接口中拿到数据信息。
猫眼电影评论接口的查找和之前的网站有一些区别。可以发现该网页的评论数量只显示到了十条评论数据。
如果想要查找到接口,需要将其装换为app_web的方式:
具体操作步骤:
**1、打开开发者工具,点击左上角的手机按钮,让请求变为手机web请求
**
2、使用F5进行刷新当前页面,使其变为手机App页面类型
当刷新完毕后,可以发现当前页面url也会发生变化
注意这里的user-agent其实也发生了变化,为Android 版本方式。我们请求是填写的请求头需要填这一个,而不是之前电脑版谷歌的
3、寻找评论接口
我们需要点击查看更多评论,一直往下刷新评论接口才会显示出来
http://m.maoyan.com/review/v2/comments.json?movieId=360504&userId=-1&offset=0&limit=15&ts=0&type=3
json数据主要参数说明:
这个就是我们找到的猫眼电影评论的接口,只不过此接口经过测试。只能爬取到前1000条评论数量。
该接口url参数说明:
- movieId 电影id
- userId=-1 用户id,就默认-1
- offset 偏移量,指每次获取评论时的起始索引,向后取15条 只能取到前1000条评论,后面可能反爬措施
- limit 限制返回的数据量 经测试最多返回21条数据
- ts 处理后的时间戳
- type=3 类型,默认为3
我们主要更改offset和ts参数就可以进行评论数据的返回。
将1000条评论数据先爬取下来,保存至csv文件中,以便后面的数据分析
import csv
import json
import time
import requests
# 保存数据为csv数据
def save_data_csv(data):
with open('zhuxian2.csv','a',encoding='utf-8-sig',newline='')as fp:
# 创建写对象
writer = csv.writer(fp)
title = ['nick','gender','score','content','upCount','userLevel']
# 解决循环存储,表头重复问题
with open('zhuxian2.csv','r',encoding='utf-8-sig',newline='')as fp:
# 创建读对象
reader = csv.reader(fp)
if not [row for row in reader]:
writer.writerow(title)
writer.writerow([data[i] for i in title])
else:
writer.writerow([data[i] for i in title])
print('*'*10+'保存完毕'+'*'*10)
# 请求目标页面,提取数据
def get_film_data(offset = 0):
# url = 'https://maoyan.com/films/360504'
# 该接口链接中的参数:
# movieId 影片id
# userId 用户id -1默认
# offset 偏移量 指每次获取评论时的起始索引,向后取15条 只能取到前1000条评论,后面可能反爬措施
# limit 限制返回的数据量 经测试最多返回21条数据
# ts 第一次访问为0,之后再前一次请求返回的数据中,时间戳
# type 类型 默认3
localtime = time.time()
# 构建一个格式化后的时间戳
ts = int(localtime * 1000)
# 但是要注意对时间进行转换,空格对应的是%20,冒号对应的是%3A
url = f'http://m.maoyan.com/review/v2/comments.json?movieId=360504&userId=-1&offset={offset}&limit=15&ts={ts}&type=3'
headers = {
'Host': 'm.maoyan.com',
'Referer': 'http://m.maoyan.com/movie/360504/comments?_v_=yes',
'User-Agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Mobile Safari/537.36'
}
cookies = {
'Cookie: __mta': '245856187.1566377737537.1569416094603.1569416143850.11',
'__mta': '245856187.1566377737537.1569416143850.1569486806493.12',
'uuid_n_v': 'v1',
'iuuid': '942C12B0DF4311E9ADA9C1C3B540BA45F066B2B3028841B8A0BC3544E4C0AD17',
'ci': '1%2C%E5%8C%97%E4%BA%AC',
'_lxsdk_cuid': '16d6c9b401ec8-0c6c86354bd8a9-5b123211-100200-16d6c9b401ec8',
'webp': 'true',
'_lxsdk': '942C12B0DF4311E9ADA9C1C3B540BA45F066B2B3028841B8A0BC3544E4C0AD17',
'_lxsdk_s': '16d6c9aec69-db9-912-eec%7C%7C94' }
# 开始页面请求,返回响应内容
response = requests.get(url,headers=headers,cookies=cookies).json()
# with open('zhuxian.html','w',encoding='utf-8')as fp:
# fp.write(response)
# pprint(response)
# 评论总数
total = response['data']['total']
# times = response['ts']
comments = response['data']['comments']