A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

湖南卫视已经开播被称作年度压轴的大戏“猎场”,迅速占领各大榜单,成为一部高热度的电视剧。但是在豆瓣上却形成了两极分化。截止11月8日,该剧在豆瓣上的评分为5.7分。相比较胡歌之前《琅琊榜》的9.1,《伪装者》的8.3等来说,这一评分确实不高。有趣的是,首页的评分比例与“短评”“剧评”的比例存在非常大的差异!
首页总评分评分两级分化严重,“差评”占主 在目前11463个评价中两级分化严重,“1星”占比最高为28.6%,其次为“5星”的25.4%。“好评”(5星、4星)占比为35.80%,“一般”(3星)为16.50%,“差评”(2星、1星)占比为47.80%。很明显,“差评”占了接近一半的比例。
《猎场》豆瓣评分占比分布 在短评和剧评中的另一种景象 首页的豆瓣评分中“差评”占比很高,但是在豆瓣的短评和剧评中却是另一番景象。 在目前5979条短评中,“好评”占比71%,“一般”为5%,“差评”占比24%。而在392条剧评中,“5星”占了非常高的比例!84.7%的剧评给了“好评”。
《猎场》剧评评分分布 我们将三个位置的评分放在一起比较就会出现非常明显的差异。根据这个差异,我们可以大致判断:写出短评或者剧评的观众大部分给予了“好评”,但仍有大量观众直接给了差评,并没有说明任何原因。当然,我们并没有考虑那些不写评论,而只是点“有用”和“没用”观众。
才刚刚上映,剧情还在慢慢的铺,所以现在给整部剧下定论还太早。
《猎场》到底好不好看?我们还是想通过以11月8日为界,看看人们短评人的情绪,是积极,还是消极。利用词云看看大家都说了什么,希望能大家就是否建议观看给出建议。
一、爬取《猎场》热门短评,豆瓣的反爬虫做的比较好,不登录爬虫很快就会被屏蔽掉,登录后获取cookies 如下:
同时建议在循环抓取的时候进行sleep,例如:
time.sleep(1 + float(random.randint(1, 100)) / 20)
《猎场》热门短评内容和时间爬取了22440条评论,代码如下:
import timeimport randomimport requestsfrom lxml import etreefrom lxml import htmlabsolute = 'https://www.smpeizi.com/subject/26322642/comments'page1_url = 'https://www.pzzs168.com/subject/26322642/comments?start=0&limit=20&sort=new_score&status=P&percent_type='absolute_url = 'https://www.aiidol.com/subject/26322642/comments?start=20&limit=20&sort=new_score&status=P&percent_type='header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0','Connection':'keep-alive'}f_cookies = open('cookies.txt', 'r')cookies = {}for line in f_cookies.read().split(';'):    name, value = line.strip().split('=', 1)    cookies[name] = valuenext_page_list = []def next_page(url):    r = requests.get(url=url,cookies=cookies,headers=header).content    soup = etree.HTML(r)    return soup.xpath('//*[@id="paginator"]/a[3]/@href')def html_prase(url):    r = requests.get(url=url,cookies=cookies,headers=header).content    return etree.HTML(r)next_page_url = next_page(absolute_url)print(page1_url)page1 = html_prase(page1_url)print("正在打印第1页面")for i in range(1, 21):    comment = ''.join(page1.xpath('//*[@id="comments"]/div[%s]/div[2]/p/text()' %i)).strip().replace('\n',',')    date = page1.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[3]/text()' %i)    if date:        date = ''.join(page1.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[3]/text()' %i)).strip()    else:        date = ''.join(page1.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]/text()' %i)).strip()    rate = page1.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]/@title' %i)    for i in rate:        if u'\u4e00' <= i <= u'\u9fff':            rate = i.strip()        else:            rate = '还行'    with open('date_rate_comment.txt', 'a', encoding='utf-8')as f:        f.write(date + ',' + rate + ',' + comment + '\n')#处理第二页以后页面    page = 2    while (next_page_url !=[]):        print('正在打印第%s页' %page)        print(absolute + ''.join(next_page_url))        html = html_prase(absolute + ''.join(next_page_url))        next_page_url = next_page(absolute + ''.join(next_page_url))        page = 2        while (next_page_url != []):            print('正在打印第%s页' % page)            print(absolute + ''.join(next_page_url))            html = html_prase(absolute + ''.join(next_page_url))            next_page_url = next_page(absolute + ''.join(next_page_url))            for i in range(1, 21):                comment = ''.join(html.xpath('//*[@id="comments"]/div[%s]/div[2]/p/text()' %i)).strip().replace('\n',',')                date = html.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[3]/text()' %i)                if date:                    date = ''.join(html.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[3]/text()' %i)).strip()                else:                    date = ''.join(html.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]/text()' %i)).strip()                rate = html.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]/@title' %i)                for i in rate:                    if u'\u4e00' <= i <= u'\u9fff':                        rate = i.strip()                    else:                        rate = '还行'                with open('date_rate_comment.txt', 'a', encoding='utf-8')as f:                    f.write(date + ',' + rate + ',' + comment + '\n')            time.sleep(1 + float(random.randint(1, 100)) / 20)            page = page + 1
[size=0.9em]导出数据格式是这样的,增加了评分,大家想基于此可以做更更多的分析。

三、对数据进行清洗:
import pandas as pdimport matplotlib.pyplot as pltname=['date','rate','comment']df = pd.read_table('./date_rate_comment.txt',encoding= 'utf-8',header=None,names=name,sep=',')df['date'] = pd.to_datetime(df['date'])
样本数量:
print(df['date'].value_counts())获取2017-11-06 – 2017-11-08 数据:
'2017-11-06':'2017-11-08'数据条数为:57752017-11-09 – 2017-11-17 数据条数为:16665
四、情感分析和词云
对热门短评基于原有SnowNLP进行积极和消极情感分类,读取每段评论并依次进行情感值分析(代码:https://www.idiancai.com/p/30107203),最后会计算出来一个0-1之间的值。
当值大于0.5时代表句子的情感极性偏向积极,当分值小于0.5时,情感极性偏向消极,当然越偏向两边,情绪越偏激。
抛开豆瓣的推荐分数,通过的热门短评的情感和词云分析,是一部不错的现实剧,剧情犀利、深刻、启迪,很多人期待。如果您有时间,不妨看一下,或许能收获一些意想不到的东西。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马