170行代码爬取《白蛇:缘起》短评数据
♚
极客猴,热衷于 Python,目前擅长利用 Python 制作网络爬虫以及 Django 框架。
阅读文本大概需要 11 分钟。
在我的童年记忆中,电视台播放的动画片大多都是从日本、美国引进的。很多动画片算是银幕上的经典,例如:《变形金刚》系列、《猛兽侠》、《蜘蛛侠》、《七龙珠》、《名侦探柯南》、《灌篮高手》、《数码宝贝》等。
但是国产的精品动画篇确认寥寥无几,可能是当时我国动漫产业还处在起步阶段。一晃几十年过去了,现在的国产动漫算是强势崛起,这也涌现出《斗破苍穹》、《秦时明月》、《天行九歌》等优秀的动画片。
2019年1月11日,一部国产动画电影《白蛇:缘起》在全国热映,一经上映便是好评如潮。这部电影凭借惊艳的花屏,出色的配音取得猫眼 9.4 分、豆瓣 8.0 分的高分成绩。
既然是难得一见的精品,那么我去猫眼上爬爬网友的短评,看看网友们的观点。
01分析页面
估计很多人经常光顾猫眼电影网,猫眼的反爬机制越来越严格,手段也越来越多。如果选择“刚正面”,爬取 PC 端的页面,可能总体收益不高。况且,PC 端的页面只有精彩短评,没有全部的网页评论数据。
因此,我选择转移战场,从手机页面入手,看看是否有收获。将浏览器选择以手机模式浏览器,结果发现手机网页有全部的短评数据。点击“查看全部讨论”,继续抓包分析。
随着鼠标滚动,自己浏览过几页短评数据之后,最终找到规律。
页面请求的地址是:
http://m.maoyan.com/review/v2/comments.json?
后面携带一些参数:
movieId=1235560& #电影id
userId=-1& #默认用户id
offset=0& #分片页数
limit=15& #每个分片显示具体数值
ts=0& #当前时间
type=3
然后 offset 的值以 15 间隔递增。
我格式化请求结果,确认能获取到短评内容、点赞数等。但是这个无法满足我的需求,我是想获取城市信息,后面想绘制地理热力图。而目前这个接口没有城市信息。
因此,我选择逛逛各大搜索引擎,试下碰碰运气。最后幸运女神帮了我一把,我找到别人已经挖掘到的猫眼短评接口。
http://m.maoyan.com/mmdb/comments/movie/1235560.json?_v_=yes&offset=1
其中 1235560 表示电影的 id,offset 代表页数。
02爬虫制作
因为短评数据量可能会比较多,所以我选择用数据库来存储数据。后面方便进行数据导出、数据去重等。
自己从 json 数据结果中提取想要的数据,然后设计数据表并创建。
def create_database(self):
create_table_sql = (
"CREATE TABLE IF NOT EXISTS {} ("
"`id` VARCHAR(12) NOT NULL,"
"`nickName` VARCHAR(30),"
"`userId` VARCHAR(12),"
"`userLevel` INT(3),"
"`cityName` VARCHAR(10),"
"`gender` tinyint(1),"
"`score` FLOAT(2,1),"
"`startTime` VARCHAR(30),"
"`filmView` BOOLEAN,"
"`supportComment` BOOLEAN,"
"`supportLike` BOOLEAN,"
"`sureViewed` INT(2),"
"`avatarurl` VARCHAR(200),"
"`content` TEXT"
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4".format(self.__table)
)
try:
self.cursor.execute(create_table_sql)
self.conn.commit()
except Exception as e:
self.close_connection()
print(e)
然后构造 Session 会话、请求头 headers 和 url 地址。
""" 构造会话 Session 抓取短评 """
session = requests.Session()
# 电影短评地址
movie_url = 'http://m.maoyan.com/mmdb/comments/movie/1235560.json?_v_=yes&offset={}'
headers = {
'User-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36',
'Accept-Encoding': 'gzip, deflate',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Host': 'm.maoyan.com',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
}
接着请求 url 地址并解析返回的 Json 数据。
offset = 1
while 1:
print('============抓取第', offset, '页短评============')
print('============>>>', movie_url.format(offset))
response = session.get(movie_url.format(offset), headers=headers)
if response.status_code == 200:
""" 解析短评 """
data_list = []
data = {}
for comment in json.loads(response.text)['cmts']:
data['id'] = comment.get('id')
data['nickName'] = comment.get('nickName')
data['userId'] = comment.get('userId')
data['userLevel'] = comment.get('userLevel')
data['cityName'] = comment.get('cityName')
data['gender'] = comment.get('gender')
data['score'] = comment.get('score')
data['startTime'] = comment.get('startTime')
data['filmView'] = comment.get('filmView')
data['supportComment'] = comment.get('supportComment')
data['supportLike'] = comment.get('supportLike')
data['sureViewed'] = comment.get('sureViewed')
data['avatarurl'] = comment.get('avatarurl')
data['content'] = comment.get('content')
print(data)
data_list.append(data)
data = {}
print('============解析到', len(data_list), '条短评数据============')
self.insert_comments(data_list)
else:
# 抓取失败就先暂停抓取, 标记抓取页数, 过段时间再抓取
print('>=== 抓取第 ', offset, ' 失败, 错误码为 ' + response.status_code)
break
offset += 1
time.sleep(random.randint(10, 20))
完成解析数据工作之后,最后一步工作就是将数据插入到数据库中。
def insert_comments(self, datalist):
""" 往数据库表中插入数据 """
insert_sql = (
"insert into "
"{} (id, nickName, userId, userLevel, cityName, gender, score, "
"startTime, filmView, supportComment, supportLike, sureViewed, avatarurl, content)"
"values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)".format(self.__table))
try:
templist = []
for comment in datalist:
if comment.get('gender') is None:
comment['gender'] = -1
data = (comment.get('id'),
comment.get('nickName'),
comment.get('userId'),
comment.get('userLevel'),
comment.get('cityName'),
comment.get('gender'),
comment.get('score'),
comment.get('startTime'),
comment.get('filmView'),
comment.get('supportComment'),
comment.get('supportLike'),
comment.get('sureViewed'),
comment.get('avatarurl'),
comment.get('content'))
templist.append(data)
self.cursor.executemany(insert_sql, templist)
self.conn.commit()
except Exception as e:
print('===== insert exception -->>> %s', e)
我因控制爬虫速率,暂时还没有完成爬取工作。至于爬取结果,详情见下篇文章关于电影短评的数据分析。
§ §
Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。
更多推荐
啥是佩奇?用Python画给你看!
隐马尔可夫模型(HMM)及Viterbi算法
深入浅出理解Python“乱码”问题
用Python爬取金融市场数据
搭建CNN模型破解网站验证码
用Python进行图文识别(OCR)
投稿邮箱:pythonpost@163.com
▼点击下方阅读原文,免费成为数据科学俱乐部会员
170行代码爬取《白蛇:缘起》短评数据相关推荐
- Python---20行代码爬取斗鱼平台房间数据(下)
在上一篇中,已经详细的讲解了如何获取数据,接下来是深度处理数据,这里调用xlsxwriter库来制作Excel表格. 工具:Python3.6.5,Pycharm 1.模块介绍 XlsxWriter模 ...
- 利用python爬取飞猪信息_Python---20行代码爬取斗鱼平台房间数据(下)-阿里云开发者社区...
在上一篇中,已经详细的讲解了如何获取数据,接下来是深度处理数据,这里调用xlsxwriter库来制作Excel表格. 工具:Python3.6.5,Pycharm 1.模块介绍 XlsxWriter模 ...
- python爬斗鱼直播_Python---20行代码爬取斗鱼平台房间数据(下)
在上一篇中,已经详细的讲解了如何获取数据,接下来是深度处理数据,这里调用xlsxwriter库来制作Excel表格. 工具:Python3.6.5,Pycharm 1.模块介绍 XlsxWriter模 ...
- Python---20行代码爬取斗鱼平台房间数据(上)
本期用到json,requests库来爬取网页信息,这次爬的是一个特殊多页式网站,普通多页式网站只需分析不同页面的url,找出其中的不同点,用for in来循环即可,但是斗鱼的https://www. ...
- python房子代码,Python---20行代码爬取斗鱼平台房间数据(上)
本期用到json,requests库来爬取网页信息,这次爬的是一个特殊多页式网站,普通多页式网站只需分析不同页面的url,找出其中的不同点,用for in来循环即可,但是斗鱼的https://www. ...
- pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...
爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...
- Python爬虫利用18行代码爬取虎牙上百张小姐姐图片
Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...
- python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息
实战项目 1:5 行代码爬取国内所有上市公司信息 Python入门爬虫与数据分析 在正式开始这门专栏课的学习之前,我们先来看一个简单的爬虫案例.兴趣是最好的老师,当你对爬虫产生兴趣的时候,才会更有动力 ...
- 简单20行代码爬取王者荣耀官网1080p壁纸
简单20行代码爬取王者荣耀官网1080p壁纸 # -*- coding: utf-8 -*- # @Time : 2020/12/13 18:08 # @Author : ningfangcong i ...
最新文章
- PHP建立和删除目录
- cat日志 搜索_大日志,看我如何对付你
- windows安装gnu_在Windows上安装GNU Emacs
- PyTorch载入图片后ToTensor解读(含PIL和OpenCV读取图片对比)
- 腾讯云短信发送api(SendSms)--java
- 谷粒商城:07. pms_catelog.sql
- 微信扫码访问网站调用默认浏览器打开如何实现?
- mdk 加static会被优化吗_网站关键词排名优化你会吗?深圳龙岗网络外包公司讲解...
- 基于物理的体积光实现
- java毕业设计校园实习管理系统mybatis+源码+调试部署+系统+数据库+lw
- 电脑打开控制面板不显示内容
- YDOOK:版权C符号:怎样在任何地方 任何位置快速输入版权符号 © 快捷键
- PDF压缩文件怎么压缩最小?用迅读PDF大师,一键无损压缩
- 英语语音篇 - 拼读规则
- 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第12章 文件 课后习题答案
- 【WebFace260M】《WebFace260M:A Benchmark Unveiling the Power of Million-Scale Deep Face Recognition》
- EventBus的基本使用
- Azure Kinect(K4A)人体识别跟踪进阶
- python生成简单名片二维码(不带图片)
- 485、CAN、单总线、SPI、I2C的概念,特点,协议,使用方法及通信方式,还有它们之间的区别
热门文章
- thinkphp mysql sum_thinkphp多表联合查询计算总和sum
- 记录我与欣旺达的校招经历
- 基于frida的几种安卓脱壳工具
- strcpy实现 模拟实现库函数strcpy
- 惠 每日餐领外卖券外卖优惠券cps系统外卖券CPS系统公众号小程序源码
- 多因子策略_单因子选股轮动测试
- 红米S2超简单刷入开发版开启Root权限的流程
- C语言之位段使用详解
- 衬线字体和无衬线字体是什么_你的字体和意识形态是什么
- 海思3536板子在使用wifi时,开启支持工具 wireless_tools 和 iptables 的内核支持选项时,板子会崩溃的解决方法