专栏首页Python小二《民国奇探》的弹幕有点逗比,用 Python 爬下来看看

《民国奇探》的弹幕有点逗比,用 Python 爬下来看看

电视剧《民国奇探》是一部充斥着逗比风的探案剧,剧中主要角色:三土、四爷、白小姐,三土这个角色类似于《名侦探柯南》中的柯南但带有搞笑属性,四爷则类似于毛利小五郎但有大哥范且武功高强,三土尚文四爷尚武,白小姐大多时候扮演着傻白甜的角色。

因为该剧目前大多数时候都处于爱奇艺电视剧的榜首位置,所以自己也看了几集,总的来说剧情紧凑,剧风逗比,当然最令我印象深刻的还是网友们逗比的弹幕,所以我决定用 Python 将弹幕爬下来大家一起瞧瞧。

数据爬取

现在开始我们的爬取工作,先用浏览器打开电视剧的网页,地址为:https://www.iqiyi.com/v_19rx2un304.html?vfrm=pcw_home&vfrmblk=B&vfrmrst=fcs_0_t12,我们使用开发者工具的 Network 功能,进到 Network 控制台后,我们先使用 Ctrl+R 命令重新加载一下网页,然后再通过过滤器搜索 bullet,如下图所示:

这里的弹幕数据是以 .z 形式的压缩文件存在的,如下图所示:

我们可以看出压缩文件命名规则为 tvid_300_n.z,所以我们先来获取 tvid 列表,代码实现如下所示:

def get_tvid():
    # tv_id 列表
    tv_id_list = []
    for i in range(1, 5):
        url = 'https://pcw-api.iqiyi.com/albums/album/avlistinfo?' \
              'aid=245212201&page='\
              + str(i) + '&size=30'
        res = requests.get(url).text
        res_json = json.loads(res)
        # 视频列表
        move_list = res_json['data']['epsodelist']
        for j in move_list:
            tv_id_list.append(j['tvId'])
    return tv_id_list

获取到 tvid 列表后,我们就可以根据 tvid 获取弹幕的压缩文件了,然后再对其进行解压及存储,实现代码如下所示:

def save_bullet(tvid):
    for page in range(1, 10):
        url = 'https://cmts.iqiyi.com/bullet/'\
              + tvid[-4:-2] + '/'\
              + tvid[-2:] + '/'\
              + tvid + '_300_'\
              + str(page) + '.z'
        print(url)
        # 请求弹幕压缩文件
        res = requests.get(url).content
        res_byte = bytearray(res)
        try:
            xml = zlib.decompress(res_byte).decode('utf-8')
            # 保存路径
            path = 'data/' + tvid + '_300_' + str(page) + '.xml'
            with open(path, 'w', encoding='utf-8') as f:
                f.write(xml)
        except:
            return

文件存储到本地之后,我们先获取每一个文件的全路径名,实现代码如下所示:

def get_file(path):
    for root, ds, fs in os.walk(path):
        for f in fs:
            yield root + '/' + f

获取到所有文件全路径名后,我们再根据全路径名获取文件并解析弹幕文本信息,实现代码如下所示:

def get_bullet_text(f):
    DOMTree = parse(f)
    collection = DOMTree.documentElement
    # 评论文本内容
    xml_list = collection.getElementsByTagName('content')
    content_list = []
    for j in xml_list:
        content_list.append(j.childNodes[0].data)
    return content_list

最后,我们可以将整个弹幕字符串信息保存起来,因为我本次爬取的弹幕信息并不是特别多,所有就先存到 txt 文件中吧,实现代码如下所示:

def save2txt(content):
    with open('bullet.txt', 'a', encoding='utf-8') as file:
        file.write(content)

词云展示

数据保存完了之后,我们再来个词云展示吧,代码实现如下所示:

def jieba_():
    content = open('bullet.txt', 'rb').read()
    # jieba 分词
    word_list = jieba.cut(content)
    words = []
    # 过滤掉的词
    remove_words = ['还是', '不会', '一些', '所以', '果然',
                    '起来', '东西', '为什么', '真的', '这么',
                    '但是', '怎么', '还是', '时候', '一个',
                    '什么', '自己', '一切', '样子', '一样',
                    '没有', '不是', '一种', '这个', '为了']
    for word in word_list:
        if word not in remove_words:
            words.append(word)
    global word_cloud
    # 用逗号隔开词语
    word_cloud = ','.join(words)

def cloud():
    # 打开词云背景图
    cloud_mask = np.array(Image.open('bg.png'))
    # 定义词云的一些属性
    wc = WordCloud(
        # 背景图分割颜色为白色
        background_color='white',
        # 背景图样
        mask=cloud_mask,
        # 显示最大词数
        max_words=300,
        # 显示中文
        font_path='./fonts/simhei.ttf',
        # 最大尺寸
        max_font_size=70
    )
    global word_cloud
    # 词云函数
    x = wc.generate(word_cloud)
    # 生成词云图片
    image = x.to_image()
    # 展示词云图片
    image.show()
    # 保存词云图片
    wc.to_file('mgqt.png')

看一下效果:

本文分享自微信公众号 - Python小二(chengxuzhijian),作者:程序员野客

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python自动化办公之Word批量转成自定义格式的Excel

    python实现word转成自定义格式的excel文档(解决思路和代码)支持按照文件夹去批量处理,也可以单独一个文件进行处理,并且可以自定义标识符。

    Python小二
  • PyCharm下载安装及激活教程

    Pycharm分为专业版(Professional)和社区版(Community),社区版无需破解直接可以使用,只是在功能上有一定限制,不过一般也能够满足业余爱...

    Python小二
  • 骚操作 | 用 Python 实现 GIF 倒放

    提到 GIF,大家应该都比较熟悉,它与 JPG、PNG 等文件格式一样,可用于制作静态图像,但是 GIF 格式还具有一项独有技能:可以用于创建动态图像。

    Python小二
  • django-import-export插件使用教程

    顾名思义,这是一个用于处理导入和导出数据的库。django-import-export库支持多种格式,包括xls、csv、json、yaml以及tablib支持...

    菲宇
  • 当我们打开shell的时候,会加载哪些配置文件呢?加载的顺序又是怎么样呢?

    阿章-python小学生
  • 网络规模更小、速度更快,这是谷歌提出的MorphNet

    深度神经网络(DNN)在解决图像分类、文本识别和语音转录等实际难题方面显示出卓越的效能。但是,为给定问题设计合适的 DNN 架构依然是一项具有挑战性的任务。考虑...

    机器之心
  • spring-cloud-kubernetes与k8s的configmap

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    程序员欣宸
  • 你好spring-cloud-kubernetes

    版权声明:欢迎转载,请注明出处,谢谢。 ...

    程序员欣宸
  • spring-cloud-kubernetes自动同步k8s的configmap更新

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    程序员欣宸
  • 实时语音视频SDK出海, 全球直播延迟低至100ms

    众所周知非洲网络条件和天朝相比相去甚远,然而在网络社会里成长的中国人几乎每个人都是重度的互联网焦虑症患者,就算千里迢迢跑到了非洲,wifi依旧如同美食一样是必不...

    BestSDK

扫码关注云+社区

领取腾讯云代金券