python爬虫,扒上万条猫眼邪不压正影评------转载+排雷

《邪不压正》评分持续走低,上万条网友评论揭秘,是救救姜文还是救救观众?

首先感谢原作者,写的是相当详尽了.但是其中还是有一些坑...特写此贴来帮助其他网友排雷...

万众期待的《邪不压正》已上映有一周时间。

但上映当日早上开画8.2,上映不到一天闪崩到7.1的评分好像已经给这部本该大展拳脚的片子,戴上了一个结结实实的囚具。

 

首日票房虽然过亿,却依旧不敌多日日票房冠军《我不是药神》;难道姜文又搞砸了?不管如何,姜文的电影总能掀起影评人高涨的评论热情;

今天就跟着恋习Python看看网友对这部姜文电影的感受到底怎么样。

接下来,恋习Python将会跟你一起用猫眼上万条评论数据来分析,网友对这部电影的反响究竟如何?整体思路,将会从数据获取、数据处理、数据可视化三部曲来进行:

一、数据获取

关于如何获取网页的数据,恋习Python一直也是推荐三步走:下载数据、解析数据、保存数据。在下载数据之前,我们看看猫眼官网的网页结构,看看网友的评论数据接口究竟在哪?

然而,打开猫眼网页(http://maoyan.com/films/248566)只有寥寥几个评论,那它的数据会不会是通过json格式保存到服务器中呢?无奈只能通过抓包猫眼APP来找其数据接口

最后,发现其数据接口为:http://m.maoyan.com/mmdb/comments/movie/248566.json?_v_=yes&offset=1,其中258566属于电影的专属id,offset代表页数

最后检验,这个接口只给展示1000页数据,如下:

 1000页都是当天数据,去重之后只有几百条,为了统计的客观性,可以连续几天爬取数据

接口找到后,开始写爬取数据代码,详情代码如下:

import requests
import json
import time
import random

#下载第一页数据
def get_one_page(url):
    headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
    }
    response = requests.get(url,headers=headers)
    if response.status_code == 200:  #页面正常响应
        return response.text # 返回页面源代码
    return None

#解析第一页数据
def parse_ono_page(html):
    data = json.loads(html)['cmts'] #评论以json形式存储,故以json形式截取
    for item in data:
        yield{ #该方法返回一个字典
            'comment':item['content'],
            'date':item['time'].split(' ')[0],
            'rate':item['score'],
            'city':item['cityName'],
            'nickname':item['nickName']
        }

#保存数据到文本文档
def save_to_txt():
    for i in range(1, 1001):
        url='http://m.maoyan.com/mmdb/comments/movie/248566.json?_v_=yes&offset=' + str(i)
        html = get_one_page(url)
        print('正在保存第%d页.'% i)
        for item in parse_ono_page(html):
            with open('D:/邪不压正影评/xie_zheng.txt','a',encoding='utf-8') as f:
                f.write(item['date'] + ',' + item['nickname'] + ',' + item['city'] + ',' +str(item['rate'])+','+item['comment']+'\n')
        #反扒
        time.sleep(5 + float(random.randint(1,100)) /20)

if __name__ == '__main__':
    save_to_txt()

二、数据处理

获取数据后发现,会有一些数据重复,如下图:

因此需要脚本批量对数据进行去重处理,详情代码如下:

# 获取的评论可能有重复,为了最终统计的真实性,需做去重处理
def main(old,new):
    oldfile = open(old,'r',encoding='UTF-8')
    newfile = open(new,'w',encoding='UTF-8')
    content_list = oldfile.readlines() #读取的数据集
    content_alreadly_ditinct = [] #存储不重复的评论数据
    for line in content_list:
        if line not in content_alreadly_ditinct: #评论不重复
            newfile.write(line+'\n')
            content_alreadly_ditinct.append(line)

if __name__ =='__main__':
    main(r'D:\邪不压正影评\xie_zheng23.txt', r'D:\邪不压正影评\xie_zheng_new23.txt')

每天可以不定时(每隔四五小时获取一次数据,基本每次可获取900多条数据),最终恋习Python获取到7/15-7/18之间上万条来作为数据集分析。

以我实际操作的经验,猫眼石每天更新1000页当日数据,不像作者叙述的这样.

三、数据可视化

大坑预警!!!!!!!!!!!!!

今天我们就用pyecharts将清理过后的万条评论数据来实现可视化。pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。(详情请看:http://pyecharts.org/)

粉丝北上广及沿海一带居多

由上图,可以看出北上广一带的用户相对较多,这些地方的互联网用户基数本来就大,同时沿海一代的三四线城市也成为票房贡献者的一部分。

详情代码如下:

大坑说明:大家应该百分百会遇到  ValueError: No coordinate is specified for XX(某地名)的错误.这错误的原因是pyecharts的坐标文件里没有xx地名,文件在

pyecharts/datasets/city_coordinates.json 中

文件格式如

{
    "阿城": [126.58, 45.32],
    "阿克苏": [80.19, 41.09],
    "阿勒泰": [88.12, 47.50],
    ...
}

这就是个大坑了,举个例子:有用户的地理坐标是'黔南',运行时是一定会提示No coordinate is specified for 黔南,查看/city_coordinates.json文件发现,里面是有黔南的,不过全称为'黔南布依族苗族自治州',这就是报错的原因!!,我们在原位置下复制个同样的,改个名就可以啦!其他此类错误都是这样解决. 我的city_coordinates.json已经被我修改过,可以适应绝大部分城市地区!

{
    "黔南": [
    107.52,
    26.27
  ],
    "黔南布依族苗族自治州": [
    107.52,
    26.27
  ]
}

还有,这只能保证找的到坐标,要画图的话,还需下载几个地图.

以下是 pyecharts 开发组托管的地图扩展(map extension):

  1. World countries include China map and World map: echarts-countries-pypkg (1.9MB)
  2. Chinese provinces and regions: echarts-china-provinces-pypkg (730KB)
  3. Chinese cities: echarts-china-cities-pypkg (3.8MB)
  4. Custom Chinese regions: echarts-china-misc-pypkg (148KB)
  5. United Kingdom map: echarts-united-kingdom-pypkg (1MB)

更多的地图数据可查看 https://github.com/echarts-maps

可以使用 pip 安装这些地图扩展。

$ pip install echarts-countries-pypkg
$ pip install echarts-china-provinces-pypkg
$ pip install echarts-china-cities-pypkg
$ pip install echarts-china-misc-pypkg
$ pip install echarts-united-kingdom-pypkg
#为了简化配置项编写,提供了一个 Style 类,可用于在同一个图或者多个图内保持统一的风格
from pyecharts import Style
# 直角坐标系上的散点图可以用来展现数据的 x,y 之间的关系,如果数据项有多个维度,可以用颜色来表现,利用 geo 组件。
from pyecharts import Geo
import sys
print(sys.path)

#读取城市数据
city = []
with open(r'D:\邪不压正影评\xie_zheng_new21.txt','r',encoding='utf-8') as f:
    rows = f.readlines()
    for row in rows:
        if len(row.split(','))==5 and row.split(',')[2]!= '':#抓取的一些城市名为空,去掉
            # 城市数据
            cityname =row.split(',')[2].replace('\n','')
            if cityname=='黔西南': #pyecharts/datasets/city_coordinates.json没有黔西南坐标,更换成兴义
                cityname='兴义'
            city.append(cityname)

#统计评论中个城市出现的次数
def all_list(arr):
    result = {}
    #使用set去重
    for i in set(arr):
        #城市名:出现次数
        result[i] = arr.count(i)
    return  result

data = []
for item in all_list(city):
    #append 只能添加一个参数,双括号代表添加的是元组
    data.append((item,all_list(city)[item]))

style = Style(
    title_color= '#fff',
    title_pos ='center',
    width = 1200,
    height = 600,
    background_color='#404a59'
)
geo = Geo('<邪不压正>粉丝人群地理位置','数据来源:猫眼',**style.init_style)
#属性,值
attr,value = geo.cast(data)
geo.add("",attr,value,visual_range=[0,20],
 visual_text_color="#fff",symbol_size=20,
 is_visualmap=True,is_piecewise=True,
 visual_split_number=4)
geo.render('邪不压正粉丝人群地理位置.html')

评论两极分化相对严重

获取到近几日的网友上万条评论数据后,我们切换到今天主题,看看网友对这部电影究竟评论如何?

我们将数据集中的评论内容提取出来,将评论分词后制作如下词云图:

可以看出,排名靠前的热词分别是姜文、不错、好看、彭于晏、剧情、看不懂等,可以看出大家对电影的评价还不错,同时估计还有一大部分粉丝是专门看国民老公彭于晏的裸奔与八块腹肌的(哈哈哈)

至于剧情方面,相对于《让子弹飞》,《邪不压正》用了更“姜文”更癫狂的方式来讲了一个相对简单的故事。

从砰砰砰几枪打出片名的那一刻起,影片就在一个极度亢奋的节奏之下不停向前推进着,伴随着应接不暇的戏谑台词,姜文无时无刻不在释放自己的任性,太疯了,甚至有些极端。对于普通观众来说,太难消化了,上一秒还没琢磨明白,下一秒又迎来了一个亢奋且莫名的环境和台词中(也验证评论中一部分网友对剧情看不懂的评价)。

详情代码如下:

大坑说明:你会发现 wordcloud 是下载不了的,报错缺少Visual C++14.0,去下载了也没什么卵用....

需要直接去https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 

下载对应的.whl文件.放在项目的lib中

cd 切换到对应文件的路径 ,然后pip install 文件名 ,可能要多试几次,但应该能安装成功的!

import pickle #使用
from os import path
import jieba #使用分词功能
#matplotlib是python上的一个2D绘图库,它可以在夸平台上边出很多高质量的图像。
# 综旨就是让简单的事变得更简单,让复杂的事变得可能。
# 我们可以用matplotlib生成 绘图、直方图、功率谱、柱状图、误差图、散点图等
import matplotlib.pyplot as plt
#wordcloud  制作云图
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator



comment = []
#获取评论数据
with open (r'D:\邪不压正影评\xie_zheng_new21.txt',mode='r',encoding='utf-8') as f:
    rows = f.readlines()
    for row in rows:
        if len(row.split(',')) == 5:
            comment.append(row.split(',')[4].replace('\n', ''))

#非全模式分词,cut_all表示非全模式
comment_after_split = jieba.cut(str(comment),cut_all=False)

wl_space_split= " ".join(comment_after_split)
#导入背景图
backgroud_Image = plt.imread(r'D:\Desktop\云图\backgroud.png')
stopwords = STOPWORDS.copy()
print(" STOPWORDS.copy()",help(STOPWORDS.copy()))
#可以加多个屏蔽词
stopwords.add("电影")
stopwords.add("一部")
stopwords.add("一个")
stopwords.add("没有")
stopwords.add("什么")
stopwords.add("有点")
stopwords.add("这部")
stopwords.add("这个")
stopwords.add("不是")
stopwords.add("真的")
stopwords.add("感觉")
stopwords.add("觉得")
stopwords.add("还是")

#设置词云参数
#参数分别是指定字体/背景颜色/最大的词的大小,使用给定图作为背景形状
wc =WordCloud(width=1024,height=768,background_color='white',
              mask = backgroud_Image,font_path='rD:\Desktop\云图\STKAITI.TTF',
              stopwords=stopwords,max_font_size=400,
              random_state=50)
#将分词后数据传入云图
wc.generate_from_text(wl_space_split)
plt.imshow(wc)
plt.axis('off')#不显示坐标轴
plt.show()
#保存结果到本地
wc.to_file(r'D:\Desktop\云图\show.jpg')

一星级影评占比高达20%

图中可以看出,五星级比例接近40%,而一星级比例与四星级比例几乎差不多,几乎为都为20%。(备注:一星级数量等于1与0.5的总和,以此类推)

很明显,姜文再次掀起了影评人和观众的论战,尽管姜文对影评人并不友好,但影评人还是愿意去袒护姜文。其实,姜文的电影关键在于你期待什么?类型片?姜文拍的从来都不是类型片。艺术片?姜文的电影里的艺术不是一遍就可以看懂的。他的电影就是带着一种“后摇风格”,浓烈、生猛。

姜文和观众都很自我,姜文端着,不肯向市场低头;观众正是因为没端着,所以看姜文的电影过于疲惫。谁都没错,谁都不用救。

详情代码如下:

#from pyecharts import ThemeRiver

rate = []
with open(r'D:\邪不压正影评\xie_zheng_new21.txt',mode='r',encoding='utf-8') as f:
    rows = f.readlines()
    for row in rows:
        if len(row.split(',')) == 5:
            rate.append(row.split(',')[3].replace('\n',''))

print(rate.count('5')+rate.count('4.5'))
print(rate.count('4')+rate.count('3.5'))
print(rate.count('3')+rate.count('2.5'))
print(rate.count('2')+rate.count('1.5'))
print(rate.count('1')+rate.count('0.5'))

#饼图
from pyecharts import Pie
attr = ["五星", "四星", "三星", "二星", "一星"]
#分别代表各星级评论数
v1 = [3324,1788,1293,553,1653]
pie = Pie('饼图-星级玫瑰图示例',title_pos='center',width=900)
pie.add("7-17", attr, v1, center=[75, 50], is_random=True,
       radius=[30, 75], rosetype='area',
       is_legend_show=False, is_label_show=True)

pie.render('评分.html')

关于《邪不压正》网友评论数据就分析到此结束!

你觉得《邪不压正》不好看是对的,因为它太姜文了。你若觉得《邪不压正》好看也是对的,因为它真的太姜文了。成也姜文,败也姜文!但这也许就是他孤傲的世界吧。

参考资料:

python安装wordcloud报错解决

jieba完整文档

猜你喜欢

转载自blog.csdn.net/LJXZDN/article/details/81229925