春节如约而至,随着消费水平的提高,越来越多的人们走进电影院,观看春节档电影。去看啥电影,先看看网友们的评分评论也是非常有必要的,于是前几天遍想到用爬虫去爬取一些有用的信息。
爬取豆瓣电影评论
可以看得出,流浪地球的评分遥遥领先,那我们便去一探究竟,来到豆瓣网搜索影评
https://movie.douban.com/subject/26266893/comments?start=220&limit=20&sort=new_score&status=P
结果发现从start=220开始页面就没有正常显示了,也就是说只能抓取前几百条评论,不过聊胜于无,咱们说干就干
html页面评论部分:
<p class="">
<span class="short">如果没有办法在科幻电影前,必须加上中国的话,那么这部电影确实在特效上做到国内目前为止的最好。但,如果放到国际,请各位扪心自问里面的特效,置景,甚至服装造型,有哪些不是在近十年科幻电影里出现过。甚至连开场设置,特效,几个关键人物都多少“致敬”了《环太平洋》。很遗憾,一部没有丝毫创新的电影,同样也无法接受它被某些影评人称之为所谓开启了“中国科幻电影元年”。更为难接受的是电影内核的价值观,无法苟同。没想到都2019年了,还是“人多力量大”和“活着”的充斥在银幕里。</span>
</p>
核心解析网页代码如下:
def getComment(url,headers):
html=getHTMLText(url,headers)
soup=BeautifulSoup(html,'html.parser')
comment=soup.findAll('span','short')
lst=[]
for com in comment:
lst.append(com.getText()+'\n')
return lst
爬取十页评论并存入txt文件
f=open('流浪地球豆瓣评论.txt', 'w', encoding='utf-8')
for page in range(10):
url='https://movie.douban.com/subject/26266893/comments?start='+ str(20*page) +'&limit=20&sort=new_score&status=P'
print ("正在爬取第%s页的评论:" % (page+1))
print (url+'\n')
for i in getComment(url,headers):
f.write(i)
部分评论如下:
还能更土更儿戏一点吗?毫无思考仅靠煽动,毫无敬畏仅余妄想。好的科幻片应该首先承认人类的无知,并跳出人类的视角去看待人与宇宙的关系,而不是一头扎入狭隘的家庭纠纷与大国情怀中自作聪明自我感动。被吹到不行的特效如同导演抡圆了膀子朝观众脸上砸各种金银珠宝,闪到不行但全无美感。有人说作为中国第一部硬科幻电影,不要跟美国比,只想说这宣传攻势票房体量已经超越大多数好莱坞商业大片了,凭啥不能和人家比?所以评价《流浪地球》很简单,你把片中所有角色换成美国人,然后再想想自己愿意打几星。
电影比预期要更恢弘磅礴,晨昏线过后的永夜、火种计划、让地球流浪、木星推动地球…等等大小设定,没想到中国也能拍这么大架构、大格局的科幻片了,而且是第一部,了不得。以前看国外科幻感觉离我们很远,这一次看到熟悉的北京大裤衩、上海东方明珠都变成零下89°冰天冻地的末世场景,既猎奇又唏嘘。虽然在剧情上有套路,对于这部中国文化背景下的科幻新生儿,鼓励多于挑剔。导演说美国人拍科幻是放弃地球、去挖掘新的人类居住地,而中国人是不放弃地球、守住家土的情怀…“希望是我们回家的唯一方向”
1.终于,轮到我们仰望星空。2.后启示录死亡废墟,赛博朋克地下城,以及烟波浩渺的末日想象,缔造了真正意义上的第一部国产硬科幻。3.拖着地球逃离太阳系的惊艳设定,本身便是对“家国情怀”的宏大投射,正应了刘慈欣那句“太阳死了,人还活着”。4.绝不仅仅只是电影工业巨壳下的类型尝试,始终荡涤其间的悲壮气息已然具备了史诗级质感,这是大刘的脑洞宇宙与电影创作团队精益求精造就的惊喜。5.屈楚萧很带感,演活了一个勇敢、中二又不失温情的英雄少年。6.期待能成爆款吧,这样才有机会等到更多的国产科幻电影;或许以后会出现更好的,但至今这无疑是最好的。
词云生成
整个提取的评论显示得也不够清楚,想到用词云来显示评论,通过jieba模块分词,Wordcloud模块生成词云
wc = WordCloud(background_color = "white", #设置背景颜色
mask = imread('ball.jpg'), #设置背景图片
max_words = 1000, #设置最大显示的字数
stopwords = ["的", "这种", "这样", "还是", "就是", "这个"], #设置停用词
font_path = "C:\Windows\Fonts\simkai.ttf", # 设置为楷体 常规
#设置中文字体,使得词云可以显示(词云默认字体是“DroidSansMono.ttf字体库”,不支持中文)
max_font_size = 60, #设置字体最大值
random_state = 30, #设置有多少种随机生成状态,即有多少种配色方案
)
myword = wc.generate(wl)#生成词云
wc.to_file('result.jpg')
效果如下图:
爬取猫眼电影评论
搜电影相关,自然也少不了去豆瓣,一看果然发现了新世界
找到猫眼的数据接口
http://m.maoyan.com/review/v2/comments.json?movieId=248906&userId=-1&offset=0&limit=15&ts=0&type=3
通过对评论数据进行分析,得到如下信息:
返回的是json格式数据
248906表示电影的专属id;
offset表示偏移量;
ts表示时间戳
相关内容链接https://blog.csdn.net/lyc44813418/article/details/86724629
cmts表示评论,每次获取15条,offset偏移量是指每次获取评论时的起始索引,向后取15条
hcmts表示热门评论前10条
total表示总评论数
{"cmts":[],"hcmts":[{"approve":42917,"approved":false,"assistAwardInfo":{"avatar":"","celebrityId":0,"celebrityName":"","rank":0,"title":""},"authInfo":"","avatarurl":"https://img.meituan.net/avatar/1f2e053c7893245cd07502db9ce0586716083.jpg","cityName":"重庆","content":"好看不解释,有些在文科班都是垫底的low不适合看,只适合看外国矫情装文艺的片。","filmView":false,"gender":1,"id":134068940,"isMajor":false,"juryLevel":0,"majorType":0,"movieId":248906,"nick":"徐木木夕","nickName":"徐木木夕","oppose":0,"pro":false,"reply":4392,"score":5,"spoiler":0,"startTime":"2019-02-05 03:23:59","supportComment":true,"supportLike":true,"sureViewed":0,"tagList":{"fixed":[{"id":1,"name":"好评"},{"id":4,"name":"购票"}]},"time":"2019-02-05 03:23","userId":133516769,"userLevel":2,"videoDuration":0,"vipInfo":"","vipType":0},{"approve":31262,"approved":false,"assistAwardInfo":
获取评论代码:
url = 'http://m.maoyan.com/review/v2/comments.json?movieId=248906&userId=-1&' \
'offset=0&limit=15&ts={}&type=3'
while self.time > self.premiere_time:
req_url = url.format(self.time)
res = requests.get(req_url, headers=self.headers)
count = 0
for com in res.json()['data']['comments']:
self.parse_comment(com=com)
count += 1
if count == 15:
self.time = com['time']
print('成功爬取截止到{}的数据!'.format(datetime.fromtimestamp(int(self.time/1000))))
#转换为datetime格式的时间
爬取首映到当前时间的电影评论其参数url: 评论真实请求的url,参数ts为时间戳,premiere_time: 首映时间的时间戳
连接mongoDB数据库并存入
# 配置mongodb数据库
host = os.environ.get('MONGODB_HOST', '127.0.0.1') # 本地数据库
port = os.environ.get('MONGODB_PORT', '27017') # 数据库端口
mongo_url = 'mongodb://{}:{}'.format(host, port)
mongo_db = os.environ.get('MONGODB_DATABASE', 'maoyan')
client = MongoClient(mongo_url)
self.db = client[mongo_db]
self.db['maoyan'].create_index('id', unique=True) # 以评论的id为主键进行去重
显示数据部分信息
一共获得84886条评论数据
详细代码戳 github.com/librauee