溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

發(fā)布時間:2020-08-03 16:48:57 來源:億速云 閱讀:301 作者:清晨 欄目:編程語言

小編給大家分享一下利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學(xué)習(xí),希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學(xué)習(xí)方法吧!

利用Python分析《慶余年》人物圖譜和微博傳播路徑

慶余年電視劇終于在前兩天上了,這兩天趕緊爬取微博數(shù)據(jù)看一下它的表現(xiàn)。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

慶余年

《慶余年》是作家貓膩的小說。這部從2007年就開更的作品擁有固定的書迷群體,也在文學(xué)IP價值榜上有名。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

期待已久的影視版的《慶余年》終于播出了,一直很擔心它會走一遍《盜墓筆記》的老路。

在《慶余年》電視劇上線后,就第一時間去看了,真香。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

慶余年微博傳播分析

《慶余年》在微博上一直霸占熱搜榜,去微博看一下大家都在討論啥:

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

一條條看顯然不符合數(shù)據(jù)分析師身份。

于是爬取了微博超話頁面,然后找到相關(guān)人員,分別去爬取相關(guān)人員的微博評論,看看大家都在討論啥。

import re
import time
import copy
import pickle
import requests
import argparse
'''微博爬蟲類'''
class weibo():
def __init__(self, **kwargs):
self.login_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome
/72.0.3626.109 Safari/537.36',
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
'Origin': 'https://passport.weibo.cn',
'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt='
}
self.login_url = 'https://passport.weibo.cn/sso/login'
self.home_url = 'https://weibo.com/'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome
/72.0.3626.109 Safari/537.36',
}
self.session = requests.Session()
self.time_interval = 1.5
'''獲取評論數(shù)據(jù)'''
def getComments(self, url, url_type='pc', max_page='all', savename=None, is_print=True, **kwargs):
# 判斷max_page參數(shù)是否正確
if not isinstance(max_page, int):
if max_page != 'all':
raise ValueError('[max_page] error, weibo.getComments -> [max_page] should be <number(int) larger than 0> 
or <all>')
else:
if max_page < 1:
raise ValueError('[max_page] error, weibo.getComments -> [max_page] should be <number(int) larger than 0> 
or <all>')
# 判斷鏈接類型
if url_type == 'phone':
mid = url.split('/')[-1]
elif url_type == 'pc':
mid = self.__getMid(url)
else:
raise ValueError('[url_type] error, weibo.getComments -> [url_type] should be <pc> or <phone>')
# 數(shù)據(jù)爬取
headers = copy.deepcopy(self.headers)
headers['Accept'] = 'application/json, text/plain, */*'
headers['MWeibo-Pwa'] = '1'
headers['Referer'] = 'https://m.weibo.cn/detail/%s' % mid
headers['X-Requested-With'] = 'XMLHttpRequest'
url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0'.format(mid, mid)
num_page = 0
comments_data = {}
while True:
num_page += 1
print('[INFO]: Start to get the comment data of page%d...' % num_page)
if num_page > 1:
url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id={}&max_id_type={}'.format(mid, mid, max_id, 
max_id_type)
res = self.session.get(url, headers=headers)
comments_data[num_page] = res.json()
if is_print:
print(res.json())
try:
max_id = res.json()['data']['max_id']
max_id_type = res.json()['data']['max_id_type']
except:
break
if isinstance(max_page, int):
if num_page < max_page:
time.sleep(self.time_interval)
else:
break
else:
if int(float(max_id)) != 0:
time.sleep(self.time_interval)
else:
break
if savename is None:
savename = 'comments_%s.pkl' % str(int(time.time()))
with open(savename, 'wb') as f:
pickle.dump(comments_data, f)
return True
'''模擬登陸'''
def login(self, username, password):
data = {
'username': username,
'password': password,
'savestate': '1',
'r': 'https://weibo.cn/',
'ec': '0',
'pagerefer': 'https://weibo.cn/pub/',
'entry': 'mweibo',
'wentry': '',
'loginfrom': '',
'client_id': '',
'code': '',
'qq': '',
'mainpageflag': '1',
'hff': '',
'hfp': ''
}
res = self.session.post(self.login_url, headers=self.login_headers, data=data)
if res.json()['retcode'] == 20000000:
self.session.headers.update(self.login_headers)
print('[INFO]: Account -> %s, login successfully...' % username)
return True
else:
raise RuntimeError('[INFO]: Account -> %s, fail to login, username or password error...' % username)
'''獲取PC端某條微博的mid'''
def __getMid(self, pc_url):
headers = copy.deepcopy(self.headers)
headers['Cookie'] = 'SUB=_2AkMrLtDRf8NxqwJRmfgQzWzkZI11ygzEieKdciEKJRMxHRl-yj83qhAHtRB6AK7-PqkF1Dj9vq59_dD6uw4ZKE
_AJB3c;'
res = requests.get(pc_url, headers=headers)
mid = re.findall(r'mblog&act=(\d+)\\', res.text)[0]
return mid
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description="weibo comments spider")
parser.add_argument('-u', dest='username', help='weibo username', default='')
parser.add_argument('-p', dest='password', help='weibo password', default='')
parser.add_argument('-m', dest='max_page', help='max number of comment pages to crawl(number<int> larger 
than 0 or all)', default=100)
parser.add_argument('-l', dest='link', help='weibo comment link', default='')
parser.add_argument('-t', dest='url_type', help='weibo comment link type(pc or phone)', default='pc')
args = parser.parse_args()
wb = weibo()
username = args.username
password = args.password
try:
max_page = int(float(args.max_page))
except:
pass
**加粗樣式**url = args.link
url_type = args.url_type
if not username or not password or not max_page or not url or not url_type:
raise ValueError('argument error')
wb.login(username, password)
wb.getComments(url, url_type, max_page)

爬取到微博評論后,老規(guī)矩,詞云展示一下,不同主角的評論內(nèi)容差別還是挺大的

微博評論詞云分析

不同主演的評論風(fēng)格差異較大,也與微博內(nèi)容息息相關(guān)。

張若昀:

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

李沁:

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

肖戰(zhàn):

emmm…算了吧

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

從目前大家的評論來看,情緒比較正向,評價較高,相信《慶余年》會越來越火的。

這部劇在微博熱度這么高,都是誰在傳播呢?

于是我進一步點擊用戶頭像獲取轉(zhuǎn)發(fā)用戶的公開信息。

看了一下幾位主演的相關(guān)微博,都是幾十萬的評論和轉(zhuǎn)發(fā),尤其是肖戰(zhàn)有百萬級的轉(zhuǎn)發(fā),嘗試爬了一下肖戰(zhàn)的微博,執(zhí)行了6個小時只爬了十分之一。

最終還是敗給了各位小飛俠,之后有結(jié)果再同步給大家。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

于是我只能挑軟柿子捏,換成官微的微博。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

這條微博發(fā)布時間是26號,經(jīng)過一段時間已經(jīng)有比較好的傳播,其中有幾個關(guān)鍵節(jié)點進一步引爆話題。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

經(jīng)過幾個關(guān)鍵節(jié)點后,進一步獲得傳播,這幾個關(guān)鍵節(jié)點分別是:

肖戰(zhàn)的超話:https://weibo.com/1081273845/Ii1ztr1BH

王小亞的微博:https://weibo.com/6475144268/Ii1rDEN6q

繼續(xù)看一下轉(zhuǎn)發(fā)該微博的用戶分析:

進一步了解轉(zhuǎn)發(fā)微博的受眾,掌握傳播范圍和深度。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

整體看下來,慶余年官微的這條微博90%都是普通用戶的轉(zhuǎn)發(fā),這部劇轉(zhuǎn)發(fā)層級達到5層,傳播范圍廣,在微博上的討論女性居多(占比89%),大部分集中在一二線城市。

原著人物關(guān)系圖譜

如果只看微博,不分析原著,那就不是一個合格的書粉。

于是我去下載了原著畫一下人物關(guān)系圖譜。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

先給大家看一下原著的人物關(guān)系圖譜:

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

emmm…確實挺丑的,大家可以去Gephi上調(diào)整。

首先我需要從原著里洗出人物名,嘗試用jieba分詞庫來清洗:

import jieba
test= 'temp.txt' #設(shè)置要分析的文本路徑
text = open(test, 'r', 'utf-8')
seg_list = jieba.cut(text, cut_all=True, HMM=False)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

生成一個適合你的列表

發(fā)現(xiàn)并不能很好的切分出所有人名,最簡單的方法是直接準備好人物名稱和他們的別名,這樣就能準確定位到人物關(guān)系。

存儲好人物表,以及他們對應(yīng)的別名(建立成字典)

def synonymous_names(synonymous_dict_path):
    with codecs.open(synonymous_dict_path, 'r', 'utf-8') as f:
        lines = f.read().split('\n')
    for l in lines:
        synonymous_dict[l.split(' ')[0]] = l.split(' ')[1]
    return synonymous_dict

接下來,清理文本數(shù)據(jù):

def clean_text(text):
    new_text = []
    text_comment = []
    with open(text, encoding='gb18030') as f:
        para = f.read().split('\r\n')
        para = para[0].split('\u3000')
    for i in range(len(para)):
        if para[i] != '':
            new_text.append(para[i])
    for i in range(len(new_text)):
        new_text[i] = new_text[i].replace('\n', '')
        new_text[i] = new_text[i].replace(' ', '')
        text_comment.append(new_text[i])
    return text_comment

我們需要進一步統(tǒng)計人物出現(xiàn)次數(shù),以及不同人物間的共現(xiàn)次數(shù):

text_node = []
for name, times in person_counter.items():
    text_node.append([])
    text_node[-1].append(name)
    text_node[-1].append(name)
    text_node[-1].append(str(times))
node_data = DataFrame(text_node, columns=['Id', 'Label', 'Weight'])
node_data.to_csv('node.csv', encoding='gbk')

結(jié)果樣例如下:

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

不愧是主角,范閑出現(xiàn)的次數(shù)超過了其他人物出現(xiàn)次數(shù)的總和,基本每個人都與主角直接或間接地產(chǎn)生影響。

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

同理可以得到不同人物的邊,具體代碼參考源文件。

接下來需要做的就是利用Gephi繪制人物關(guān)系圖譜:

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

運行結(jié)果:

利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法

以上是利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI