《民國奇探》的彈幕有點逗比,用 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 自行領取。