前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大江大河,一代人的缩影

大江大河,一代人的缩影

作者头像
Crossin先生
发布2019-04-30 18:29:11
4590
发布2019-04-30 18:29:11
举报
文章被收录于专栏:Crossin的编程教室

春节时,在家闲着无聊,刷了一部电视剧。

即「大江大河」,豆瓣评分8.9分。

主要讲述了1978到1992年间改革开放的大背景下。

以宋运辉、雷东宝、杨巡为代表的先行者们在变革浪潮中不断探索和突围的浮沉故事。

总的来说是一部很不错的电视剧。

恰巧那时在B站看完了吴晓波2018年的跨年演讲。

里面提到了,如果你是一个1978年的中国青年,有可能需要按下一个血手印。

故事来源于18个安徽凤阳小岗村农民的分田计划。

我觉得「大江大河」就很好的展现出了那个时代的现状。

农村改革的先行者东宝书记,知识改变命运的宋运辉,个体经营打拼的小杨巡。

都有着自己的人生,去阐述那个时代的点滴。

这也是吸引我继续观看这部电视剧的原因。

去了解那个时代的青年,他们对体制的突破以及改变自己过去的勇气。

然后结合最近「流浪地球」豆瓣电影短评的差评的现象。

我也爬取了「大江大河」的豆瓣短评。

来看看有什么猫腻没有。

/ 01 / 网页分析

虽然评论有两万多条,但是豆瓣在登陆的情况下,也只是放出500条数据

本次只获取全部评论以及差评评论标签页下的数据,合计约为900多条

然后便是获取用户的注册时间。

900多个用户,900多个请求。

因为豆瓣对请求频率限制很严,我不得不使用了付费的代理服务。即便如此,依然遭到了封锁:

/ 02 / 数据获取

评论及用户信息获取的代码如下。

代码语言:javascript
复制
import time
import requests
import proxy2808
from bs4 import BeautifulSoup

USERNAME = '用户名'
PASSWORD = '密码'

headers = {
    'Cookie': '你的Cookie值',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}


def get_comments(page, proxy_url_secured):
    """
    评论获取
    """
    # 热门评论获取
    url = 'https://movie.douban.com/subject/26797690/comments?start=' + str(page) + '&limit=20&sort=new_score&status=P'
    # 好评获取
    # url = 'https://movie.douban.com/subject/26797690/comments?start=' + str(page) + '&limit=20&sort=new_score&status=P&percent_type=h'
    # 一般评论获取
    # url = 'https://movie.douban.com/subject/26797690/comments?start=' + str(page) + '&limit=20&sort=new_score&status=P&percent_type=m'
    # 差评获取
    # url = 'https://movie.douban.com/subject/26797690/comments?start=' + str(page) + '&limit=20&sort=new_score&status=P&percent_type=l'
    response = requests.get(url=url, headers=headers, proxies={'http': proxy_url_secured, 'https': proxy_url_secured})
    soup = BeautifulSoup(response.text, 'html.parser')
    for div in soup.find_all(class_='comment-item'):
        time.sleep(3)
        # 评论信息
        comment_info = div.find(class_='comment-info')
        # 用户名
        user_name = comment_info.find('a').get_text()
        print(user_name)
        # 用户主页地址
        user_url = comment_info.find('a').attrs['href']
        print(user_url)
        # 获取用户注册时间,看水军必备
        registered_time = get_user(user_url, proxy_url_secured)
        print(registered_time)
        # 用户评分
        score = comment_info.find_all('span')[1].attrs['class'][0][-2:-1]
        print(score)
        # 用户评价
        eva = comment_info.find_all('span')[1].attrs['title']
        print(eva)
        # 有用数
        useful_num = div.find(class_='votes').get_text()
        print(useful_num)
        # 评价日期
        date = comment_info.find(class_='comment-time ').attrs['title'].split(' ')[0]
        print(date)
        # 评价时间
        comment_time = comment_info.find(class_='comment-time ').attrs['title'].split(' ')[1]
        print(comment_time)
        # 用户评论
        comment = div.find(class_='short').get_text().replace('
', '').strip().replace(',', ',').replace(' ', '')
        print(comment)
        # 写入csv文件
        with open('comments_douban_l.csv', 'a', encoding='utf-8-sig') as f:
            f.write(user_name + ',' + user_url + ',' + registered_time + ',' + score + ',' + date + ',' + comment_time + ',' + useful_num + ',' + comment + '
')
        f.close()


def get_user(user_url, proxy_url_secured):
    """
    获取用户注册时间
    """

    response = requests.get(url=user_url, headers=headers, proxies={'http': proxy_url_secured, 'https': proxy_url_secured})
    soup = BeautifulSoup(response.text, 'html.parser')
    user_message = soup.find(class_='basic-info')
    # 获取用户注册时间
    try:
        user_registered = user_message.find(class_='pl')
        registered_time = user_registered.get_text().split('  ')[1].replace('加入', '')
    except:
        registered_time = 'unknow'
    return registered_time


def main():
    num = 0
    for i in range(0, 500, 20):
        cli = proxy2808.Client(username=USERNAME, password=PASSWORD) 
        cli.release_all()    # 使用2808proxy代理
        p = cli.get_proxies(amount=1, expire_seconds=300)[0]
        proxy_url_secured = "%s://%s:%s@%s:%d" % ('http', USERNAME, PASSWORD, p['ip'], p['http_port_secured'])
        print(proxy_url_secured)
        get_comments(i, proxy_url_secured)
        num += 1


if __name__ == '__main__':
    main()

获取全部评论标签页下的数据(500条)。

红框部分为用户的注册时间。

假设我能爬取所有评论,那么水军估计要被我逮到了。

个人理解,水军就是过多的新注册用户...

然而豆瓣并没有给我们这个机会。

获取差评标签页的数据(482条)。

看看给差评的用户注册时间。

相较好评的用户注册时间,有那么点意思了。

注册时间相对都比较晚。

难不成豆瓣真有水军...

差评水军,我劝你善良。

/ 03 / 情感分析

评论的情感分析使用百度的自然语言处理。

下面利用网站做个示例。

具体的可以去官网看文档,这里只是简述一番。

通过你的百度账号登陆百度的AI开发平台,新建自然语言处理项目。

获取「API Key」及「Secret Key」后。

调用情感倾向分析接口,得到情感结果。

代码语言:javascript
复制
import urllib.request
import pandas
import json
import time


def get_access_token():
    """
    获取百度AI平台的Access Token
    """
    # 使用你的API Key及Secret Key
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
    request = urllib.request.Request(host)
    request.add_header('Content-Type', 'application/json; charset=UTF-8')
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    rdata = json.loads(content)
    return rdata['access_token']


def sentiment_classify(text, acc):
    """
    获取文本的感情偏向(消极 or 积极 or 中立)
    参数:
    text:str 本文
    """
    raw = {"text":"内容"}
    raw['text'] = text
    data = json.dumps(raw).encode('utf-8')
    # 情感倾向分析接口
    host = "https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token=" + acc
    request = urllib.request.Request(url=host, data=data)
    request.add_header('Content-Type', 'application/json')
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    rdata = json.loads(content)
    return rdata


# 获取access_token
access_token = get_access_token()
# 差评标签
df = pandas.read_csv('comments_douban_l.csv', header=None, names=['user_name', 'user_url', 'registered_time', 'score', 'date', 'comment_time', 'useful_num', 'comment'])
# 好评标签
# df = pandas.read_csv('comments_douban_a.csv', header=None, names=['user_name', 'user_url', 'registered_time', 'score', 'date', 'comment_time', 'useful_num', 'comment'])

# 输出情感极性分类结果,0:负向,1:中性,2:正向
sentiments = []
for text in df['comment']:
    time.sleep(1)
    result = sentiment_classify(str(text), access_token)
    value = result['items'][0]['sentiment']
    sentiments.append(value)
    # print(result)
    print(result['items'][0]['sentiment'], text)

# 添加评分列及情感列
df['score1'] = df['score']
df['emotional'] = sentiments
# 差评标签
df.to_csv('comments_douban_ll.csv', header=0, index=False, encoding='utf-8-sig')
# 好评标签
# df.to_csv('comments_douban_al.csv', header=0, index=False, encoding='utf-8-sig')

情感分析结果如下。

总的来说5星评分的结果多为正向(2)的。

当然也出现了一些负向(0)的结果。

不过还是在可接受范围内。

没什么大影响。

1星评分的评论情感倾向多为负向。

这里把正向的用红框圈出来了,大家可以自行体会。

毕竟机器的识别水平有限,想达到100%识别,可能性几乎为0。

这就好比语文试卷拿满分,闻所未闻。

总而言之,百度这个情感倾向分析,很不错。

/ 04 / 数据可视化

01 评论日期分布情况

热评随着电视剧的开播,便慢慢没有什么变化。

而差评却在后头有一些波动。

假设我们能够获取到差评有异常时所有的用户注册时间。

那么便能看是否真的有水军存在。

当然此处仅仅是一个假想而已,豆瓣早已把你我拒之门外。

02 评论时间分布情况

大部分评论都是在晚上评论的,符合常态。

估摸着晚上都是大家的娱乐时间,便有了闲情逸致去写评论。

03 评论评分情况

全部短评的5星评分占大头。

全部差评的1星和2星占大头。

这对得起豆瓣的8.9分了。

04 评论情感分析情况

其中「2」代表积极的,「1」代表中性的,「-2」代表消极的。

全部短评的正向结果占大头。

全部短评的排序是基于点赞数而来的。

所以对于整部剧,大家还是比较认可的。

全部差评的负向结果占大头。

给了差评,情感倾向果断差了。

05 评论用户注册时间

由于数据比较少,所以大家看着乐呵就好。

要想判断出有水军还是有难度的。

06 评论词云

好评词云。

充满了满满的正能量。

差评词云。

「看不下去」「失望」「恶心」「难看」,体现了大家对于这部剧的负面评价。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档