博客
关于我
爬取了 36141 条评论数据,解读 9.5 分的《海王》是否值得一看
阅读量:290 次
发布时间:2019-03-01

本文共 5699 字,大约阅读时间需要 18 分钟。

这是第一个python项目,之前看到了《》这篇文章,一直想自己动手做一个,刚刚好前两天看了《海王》,就想捣鼓一下,看看海王值不值得看。

获取数据

首先要获取评论数据,准备爬取猫眼上的电影评论作为本次分析样本,PC官网上只显示了电影的10条热门短评,显然不够,从移动端抓取评论接口。

如图,我们获取的接口链接为:

通过修改offset偏移量以及日期来抓取所有的评论。

接口获取的样品数据如下:

获取需要的数据,昵称,地区,评论,分值,评论时间这五个字段数据,python的requests模块开始爬取,模块使用前须先导入。

#获取原始用户评论数据def get_data(url):    headers = {        'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'}    html = requests.get(url, headers=headers)    if html.status_code == 200:        #print(html.content)        return html.content    else:        return null

然后解析返回的json数据,并只取以上五个字段的值

##解析json数据def parse_data(html):    content = json.loads(html)    json_data = content['cmts']    total = content['total']    print(total)    comments = []    try:        for item in json_data :            comment = {                'nickname':item['nickName'],                'cityName':item['cityName'] if 'cityName' in item else'',                'content':item['content'].strip().replace('\n',''),                'score':item['score'],                'startTime':item['startTime']            }            comments.append(comment)        return comments    except Exception as e:        print(e)

为了获取所有的评论,将本次返回评论的最后一条评论时间减去1s,当做获取下一组评论的开始时间,并将所有数据保存到文本文档中

##获取数据保存到本地def save():    start_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')    end_time = '2018-12-07 00:00:00'    while start_time > end_time:        url = 'http://m.maoyan.com/mmdb/comments/movie/249342.json?_v_=yes&offset=15&startTime='+start_time.replace(' ','%20')        html = None        try:            html = get_data(url)        except Exception as e:            time.sleep(0.5)            html = get_data(url)        else:            time.sleep(0.1)        comments = parse_data(html)        start_time = comments[14]['startTime']        print('评论最后一条评论时间:'+start_time)        start_time = datetime.strptime(start_time,'%Y-%m-%d %H:%M:%S') + timedelta(seconds=-1)        start_time = datetime.strftime(start_time,'%Y-%m-%d %H:%M:%S')        for item in comments:            print(item)            with open('/home/alex/File/data/aquaman.txt','a',encoding='UTF-8') as f:                f.write(item['nickname']+':'+item['cityName']+':'+item['content']+':'+str(item['score'])+':'+item['startTime']+'\n')    print("finished")

最终获取了36141条评论数据

数据可视化

数据可视化采用了pyecharts,按照地理位置制作了毒液观众群的分布图。由于echarts中provinces、cities和countries模块中对应的省市地区名称与导出不一致就没有做观影人数在地理坐标系中的分布。代码如下:

def paint_geo():    citys = []    data =[ ]    with open('/home/alex/File/data/aquaman.txt', 'r', encoding='utf-8')as f:        rows = f.readlines()        try:            for row in rows:                city = row.split(':')[1]                if city != '':                    if city in citys:                        data = city_plus_one(city, data)                    else:                        citys.append(city)                        data.append((city,1))        except Exception as e:            print(e)    print(data)    # geo = Geo("《海王》观影城市分布", "数据来源:猫眼 截止2018-12-12 10:02:04", title_color="#fff", title_pos="center", width=1200, height=600,    #           background_color='#404a59')    # attr, value = geo.cast(data)    # geo.add('', attr, value, visual_range=[0, 1000],    #         visual_text_color='#fff', symbol_size=15,    #         is_visualmap=True, is_piecewise=False, visual_split_number=10)    # geo.show_config()    # geo.render("观影城市分布地理坐标图.html")    #根据元组第2个元素,即观影人数到序    data.sort(key=take_second,reverse=True);    #获取前20个光影人数的城市和数量    data_top20 = data[:20]    bar = Bar('《海王》观众来源排行TOP20', '数据来源:猫眼 截止2018-12-12 10:02:04', title_pos='center', width=1200, height=600)    #将字典或元组返回成key和value    attr, value = Base.cast(data_top20)    bar.add('', attr, value, is_visualmap=True, visual_range=[0, 3500], visual_text_color='#fff', is_more_utils=True,            is_label_show=True)    bar.render('观众来源排行-柱状图.html')##如果城市相同,则加1def city_plus_one(key,list):    for tuple in list:        if key == tuple[0]:            t = (key,tuple[1]+1)            list.remove(tuple)            list.append(t)    return list##获取元组第二个元素def take_second(elem):    return elem[1]

用户评论:词云图

只看观众分布无法判断大家对电影的喜好,所以通过jieba把评论分词,最后通过wordcloud制作词云,作为大众对该电影的综合评价。

def paint_word_cloud():    comments = []    with open('/home/alex/File/data/aquaman.txt', 'r', encoding='utf-8')as f:        rows = f.readlines()        try:            for row in rows:                comment = row.split(':')[2]                if comment != '':                    comments.append(comment)            print(comments)        except Exception as e:            print(e)    comment_after_split = jieba.cut(str(comments), cut_all=False)    words = ' '.join(comment_after_split)    print(words)    # 多虑没用的停止词    stopwords = STOPWORDS.copy()    stopwords.add('电影')    stopwords.add('一部')    stopwords.add('一个')    stopwords.add('没有')    stopwords.add('什么')    stopwords.add('有点')    stopwords.add('感觉')    stopwords.add('海王')    stopwords.add('就是')    stopwords.add('觉得')    stopwords.add('但是')    bg_image = plt.imread('/home/alex/File/img/2.jpg')    print('load image success')    print(words)    wc = WordCloud(        # 画布的宽度和高度,如果设置mask不生效        #width=1024, height=768,        # 背景色        background_color='white',        # 词云形状        mask=bg_image,        # 字体路径,若有中文,必须添加这句代码,否则中文变方框        font_path='/home/alex/File/Font/STZHONGS.TTF',        # 设置停用时间        stopwords=stopwords,        # 最大字号,如果不指定则为图像高度        max_font_size=400,        #有多少种配色方案        random_state=50)    wc.generate_from_text(words)    wc.to_file('/home/alex/File/img/man.jpg')    plt.imshow(wc)    plt.axis('off')    plt.show()

从评论来看还是很值得一看的,附上一张制作词云的背景图

 

转载地址:http://gtla.baihongyu.com/

你可能感兴趣的文章
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>