《民國奇探》的彈幕有點逗比,用 Python 爬下來看看


電視劇《民國奇探》是一部充斥著逗比風的探案劇,劇中主要角色:三土、四爺、白小姐,三土這個角色類似於《名偵探柯南》中的柯南但帶有搞笑屬性,四爺則類似於毛利小五郎但有大哥范且武功高強,三土尚文四爺尚武,白小姐大多時候扮演著傻白甜的角色。

因為該劇目前大多數時候都處於愛奇藝電視劇的榜首位置,所以自己也看了幾集,總的來說劇情緊湊,劇風逗比,當然最令我印象深刻的還是網友們逗比的彈幕,所以我決定用 Python 將彈幕爬下來大家一起瞧瞧。

數據爬取

現在開始我們的爬取工作,先用瀏覽器打開電視劇的網頁,地址為://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 = '//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 = '//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')

看一下效果:

如果需要源碼,可以掃描文末二維碼關注公眾號,後台回復 200414 自行領取。

Tags: