利用Python分析《庆余年》人物图谱和微博传播路径的方法
小編給大家分享一下利用Python分析《慶余年》人物圖譜和微博傳播路徑的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學習,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學習方法吧!
利用Python分析《慶余年》人物圖譜和微博傳播路徑
慶余年電視劇終于在前兩天上了,這兩天趕緊爬取微博數據看一下它的表現。
慶余年
《慶余年》是作家貓膩的小說。這部從2007年就開更的作品擁有固定的書迷群體,也在文學IP價值榜上有名。
期待已久的影視版的《慶余年》終于播出了,一直很擔心它會走一遍《盜墓筆記》的老路。
在《慶余年》電視劇上線后,就第一時間去看了,真香。
慶余年微博傳播分析
《慶余年》在微博上一直霸占熱搜榜,去微博看一下大家都在討論啥:
一條條看顯然不符合數據分析師身份。
于是爬取了微博超話頁面,然后找到相關人員,分別去爬取相關人員的微博評論,看看大家都在討論啥。
importre
importtime
importcopy
importpickle
importrequests
importargparse
'''微博爬蟲類'''
classweibo():
def__init__(self,**kwargs):
self.login_headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome
/72.0.3626.109Safari/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(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome
/72.0.3626.109Safari/537.36',
}
self.session=requests.Session()
self.time_interval=1.5
'''獲取評論數據'''
defgetComments(self,url,url_type='pc',max_page='all',savename=None,is_print=True,**kwargs):
#判斷max_page參數是否正確
ifnotisinstance(max_page,int):
ifmax_page!='all':
raiseValueError('[max_page]error,weibo.getComments->[max_page]shouldbe<number(int)largerthan0>
or<all>')
else:
ifmax_page<1:
raiseValueError('[max_page]error,weibo.getComments->[max_page]shouldbe<number(int)largerthan0>
or<all>')
#判斷鏈接類型
ifurl_type=='phone':
mid=url.split('/')[-1]
elifurl_type=='pc':
mid=self.__getMid(url)
else:
raiseValueError('[url_type]error,weibo.getComments->[url_type]shouldbe<pc>or<phone>')
#數據爬取
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={}
whileTrue:
num_page+=1
print('[INFO]:Starttogetthecommentdataofpage%d...'%num_page)
ifnum_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()
ifis_print:
print(res.json())
try:
max_id=res.json()['data']['max_id']
max_id_type=res.json()['data']['max_id_type']
except:
break
ifisinstance(max_page,int):
ifnum_page<max_page:
time.sleep(self.time_interval)
else:
break
else:
ifint(float(max_id))!=0:
time.sleep(self.time_interval)
else:
break
ifsavenameisNone:
savename='comments_%s.pkl'%str(int(time.time()))
withopen(savename,'wb')asf:
pickle.dump(comments_data,f)
returnTrue
'''模擬登陸'''
deflogin(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)
ifres.json()['retcode']==20000000:
self.session.headers.update(self.login_headers)
print('[INFO]:Account->%s,loginsuccessfully...'%username)
returnTrue
else:
raiseRuntimeError('[INFO]:Account->%s,failtologin,usernameorpassworderror...'%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]
returnmid
if__name__=='__main__':
importargparse
parser=argparse.ArgumentParser(description="weibocommentsspider")
parser.add_argument('-u',dest='username',help='weibousername',default='')
parser.add_argument('-p',dest='password',help='weibopassword',default='')
parser.add_argument('-m',dest='max_page',help='maxnumberofcommentpagestocrawl(number<int>larger
than0orall)',default=100)
parser.add_argument('-l',dest='link',help='weibocommentlink',default='')
parser.add_argument('-t',dest='url_type',help='weibocommentlinktype(pcorphone)',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
ifnotusernameornotpasswordornotmax_pageornoturlornoturl_type:
raiseValueError('argumenterror')
wb.login(username,password)
wb.getComments(url,url_type,max_page)
爬取到微博評論后,老規矩,詞云展示一下,不同主角的評論內容差別還是挺大的
微博評論詞云分析
不同主演的評論風格差異較大,也與微博內容息息相關。
張若昀:
李沁:
肖戰:
emmm…算了吧
從目前大家的評論來看,情緒比較正向,評價較高,相信《慶余年》會越來越火的。
這部劇在微博熱度這么高,都是誰在傳播呢?
于是我進一步點擊用戶頭像獲取轉發用戶的公開信息。
看了一下幾位主演的相關微博,都是幾十萬的評論和轉發,尤其是肖戰有百萬級的轉發,嘗試爬了一下肖戰的微博,執行了6個小時只爬了十分之一。
最終還是敗給了各位小飛俠,之后有結果再同步給大家。
于是我只能挑軟柿子捏,換成官微的微博。
這條微博發布時間是26號,經過一段時間已經有比較好的傳播,其中有幾個關鍵節點進一步引爆話題。
經過幾個關鍵節點后,進一步獲得傳播,這幾個關鍵節點分別是:
肖戰的超話:https://weibo.com/1081273845/Ii1ztr1BH
王小亞的微博:https://weibo.com/6475144268/Ii1rDEN6q
繼續看一下轉發該微博的用戶分析:
進一步了解轉發微博的受眾,掌握傳播范圍和深度。
整體看下來,慶余年官微的這條微博90%都是普通用戶的轉發,這部劇轉發層級達到5層,傳播范圍廣,在微博上的討論女性居多(占比89%),大部分集中在一二線城市。
原著人物關系圖譜
如果只看微博,不分析原著,那就不是一個合格的書粉。
于是我去下載了原著畫一下人物關系圖譜。
先給大家看一下原著的人物關系圖譜:
emmm…確實挺丑的,大家可以去Gephi上調整。
首先我需要從原著里洗出人物名,嘗試用jieba分詞庫來清洗:
importjieba
test='temp.txt'#設置要分析的文本路徑
text=open(test,'r','utf-8')
seg_list=jieba.cut(text,cut_all=True,HMM=False)
print("FullMode:"+"/".join(seg_list))#全模式
生成一個適合你的列表
發現并不能很好的切分出所有人名,最簡單的方法是直接準備好人物名稱和他們的別名,這樣就能準確定位到人物關系。
存儲好人物表,以及他們對應的別名(建立成字典)
defsynonymous_names(synonymous_dict_path):
withcodecs.open(synonymous_dict_path,'r','utf-8')asf:
lines=f.read().split('\n')
forlinlines:
synonymous_dict[l.split('')[0]]=l.split('')[1]
returnsynonymous_dict
接下來,清理文本數據:
defclean_text(text):
new_text=[]
text_comment=[]
withopen(text,encoding='gb18030')asf:
para=f.read().split('\r\n')
para=para[0].split('\u3000')
foriinrange(len(para)):
ifpara[i]!='':
new_text.append(para[i])
foriinrange(len(new_text)):
new_text[i]=new_text[i].replace('\n','')
new_text[i]=new_text[i].replace('','')
text_comment.append(new_text[i])
returntext_comment
我們需要進一步統計人物出現次數,以及不同人物間的共現次數:
text_node=[]
forname,timesinperson_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')
結果樣例如下:
不愧是主角,范閑出現的次數超過了其他人物出現次數的總和,基本每個人都與主角直接或間接地產生影響。
同理可以得到不同人物的邊,具體代碼參考源文件。
接下來需要做的就是利用Gephi繪制人物關系圖譜:
運行結果:
總結
以上是生活随笔為你收集整理的利用Python分析《庆余年》人物图谱和微博传播路径的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何卸载mysql重新安装win10_学
- 下一篇: c语言五子棋代码_基于控制台的C语言贪吃