Python分析《武林外传》 -----转载

本文通过爬取《武林外传》豆瓣评论并利用SnowNLP进行情感分析,结果显示观众对此剧持有积极态度。同时,通过对评论进行词云分析,进一步揭示观众对该剧的喜爱之情。

转载原链接: http://www.cnblogs.com/fredkeke/p/8328387.html

      我一向比较喜欢看武侠电影、小说,但是06年武林外传开播的时候并没有追剧,简单扫几眼之后发现他们都不会那种飞来飞去的打,一点也不刺激。09年在南京培训的时候,日子简单无聊透顶,大好的周末不能出门,只能窝在几平米的宿舍,一帮老爷们打游戏看电影,也就是在这个时候开始认真的看武林外传,从此一发不可收拾。

      在之后这么多年,这部剧成了我茶余饭后消遣的必备品,吃饭的时候看一集、上厕所的时候看一点、挤地铁的上班路上看一看笑一笑……

      好吧,废话就不多说了,进入今天的正题。《武林外传》豆瓣评分9.3,共计124,140人评价,5颗星占比73.2%,4颗星20.7%,3颗星5.2%。为了更好的分析大家对这部剧的评价,咱们通过分析短评人的情绪和词云来看一下。

      首先,爬取《武林外传》热门短评,豆瓣的反爬虫做的还是比较好的,不登陆账户的爬虫或者短时间不限制时间的爬取数据都会被暂时封锁账户。因此,要登陆账户,拿到cookies,并且在循环爬取数据时设置sleep,

例如:time.sleep(random.randint(1, 10))

《武林外传》热门短评共爬取了507条评论,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import  time
import  random
import  requests
from  lxml  import  etree
absolute  =  'https://movie.douban.com/subject/3882715/comments'
page1_url  =  'https://movie.douban.com/subject/3882715/comments?start=0&limit=20&sort=new_score&status=P&percent_type='
page2_url  =  'https://movie.douban.com/subject/3882715/comments?start=20&limit=20&sort=new_score&status=P&percent_type='
header = { 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' , 'Connection' : 'keep-alive' }
f_cookies  =  open ( 'cookies.txt' 'r' )
cookies  =  {}
for  line  in  f_cookies.read().split( ';' ):
     name, value  =  line.strip().split( '=' 1 )
     cookies[name]  =  value
 
def  next_page(url):
     =  requests.get(url = url,cookies = cookies,headers = header).content
     soup  =  etree.HTML(r)
     return  soup.xpath( '//*[@id="paginator"]/a[3]/@href' )
 
def  html_prase(url):
     =  requests.get(url = url,cookies = cookies,headers = header).content
     return  etree.HTML(r)
 
def  comment_scripy(url):
     page  =  html_prase(url)
     for  in  range ( 1 21 ):
         comment  =  ' '.join(page.xpath(' / / * [@ id = "comments" ] / div[ % s] / div[ 2 ] / p / text() ' %i)).strip().replace(' \n ', ' ,')
         date  =  page.xpath( '//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[3]/text()'  % i)
         if  date:
             date  =  ' '.join(page.xpath(' / / * [@ id = "comments" ] / div[ % s] / div[ 2 ] / h3 / span[ 2 ] / span[ 3 ] / text()'  % i)).strip()
         else :
             date  =  ' '.join(page.xpath(' / / * [@ id = "comments" ] / div[ % s] / div[ 2 ] / h3 / span[ 2 ] / span[ 2 ] / text()'  % i)).strip()
         rate  =  page.xpath( '//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]/@title'  % i)
         for  in  rate:
             if  u '\u4e00'  < =  i < =  u '\u9fff' :
                 rate  =  i.strip()
             else :
                 rate  =  '还行'
         with  open ( 'date_rate_comment.txt' 'a' , encoding = 'utf-8' ) as f:
             f.write( str (date)  +  ','  +  str (rate)  +  ','  +  str (comment)  +  '\n' )
 
print ( '正在打印第1页:' )
comment_scripy(page1_url)
time.sleep(random.randint( 1 10 ))
print ( '正在打印第2页:' )
comment_scripy(page2_url)
time.sleep(random.randint( 1 10 ))
 
next_page_url  =  absolute  +  ''.join(next_page(page2_url))
print (next_page_url)
page  =  3
while (next_page_url ! =  absolute):
     print ( '正在打印第%s页'  %  page)
     next_page_url  =  absolute  +  ''.join(next_page(next_page_url))
     print (next_page_url)
     comment_scripy(next_page_url)
     if  page / 100  and  page % 100 = = 0 :
         time.sleep( 100 )
     else :
         time.sleep(random.randint( 1 10 ))
     page  =  page  +  1

其中cookies.txt文件就是每个人登陆后拿到的cookies对应的一长串数字代码,粘贴进txt空白文件就可以了。

接下来对数据进行清洗:

1
2
3
4
import  pandas as pd
name  =  [ 'date' 'rate' 'comment' ]
df  =  pd.read_table( 'date_rate_comment.txt' , encoding = 'utf-8' , header = None , names = name, sep = ',' )
df[ 'date' =  pd.to_datetime(df[ 'date' ])

情感分析:

对短评给予SnowNPLP进行积极和消极情感分析,读取每段评论并进行情感值分析,最后计算出数值(0-1之间),当值大于0.5时代表句子的情感极性偏向积极,当分值小于0.5时,情感极性偏向消极,当然越偏向两边,说明大家看法分化越严重。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import  numpy as np
from  snownlp  import  SnowNLP
import  matplotlib.pyplot as plt
 
comment  =  []
with  open ( 'date_rate_comment.txt' , mode = 'r' , encoding = 'utf-8' ) as f:
     rows  =  f.readlines()
     for  row  in  rows:
         if  row  not  in  comment:
             comment.append(row.strip( '\n' ))
 
def  snowAnalysis( self ):
     sentimentslist  =  []
     for  li  in  self :
         print (li)
         =  SnowNLP(li)
         print (s.sentiments)
         sentimentslist.append(s.sentiments)
     plt.hist(sentimentslist, bins = np.arange( 0 1 0.01 ))
     plt.savefig( "snowAnalysis.jpg" )
     plt.show()
 
snowAnalysis(comment)

 图示如下:

 

 

从上图情感分析可以看出来,大家对这部剧还是非常积极的。

词云分析代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from  os  import  path
import  jieba
import  matplotlib.pyplot as plt
from  wordcloud  import  WordCloud, ImageColorGenerator
 
def  worldCloud(file_path):
     =  open (file_path, 'r' ,encoding = 'UTF-8' ).read()
     words_after_jieba  =  jieba.cut(f, cut_all = False )
     words_list  =  " " .join(words_after_jieba)
     print (words_list)
     backgroud_Image  =  plt.imread( 'wulinwaizhuan.jpg' )
     print ( '加载图片成功!' )
 
     '''设置词云样式'''
     stopwords  =  [ '哈哈' '还是' '电影' '你们' '这么' '不过' '什么' '没有' '这个' '那个' '大家' '比较' '真是' '觉得' '那么' ]
 
     wc  =  WordCloud(
         width = 1024 ,
         height = 860 ,
         background_color = 'white' , # 设置背景颜色
         mask = backgroud_Image, # 设置背景图片
         font_path = 'Font/SimSun.ttf' ,   # 设置中文字体,若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
         max_words = 300 # 设置最大现实的字数
         stopwords = stopwords, # 设置停用词
         max_font_size = 400 , # 设置字体最大值
         random_state = 50 , # 设置有多少种随机生成状态,即有多少种配色方案
     )
     wc.generate(words_list)
     #wc.generate_from_text(wl_space_split)#开始加载文本
     img_colors  =  ImageColorGenerator(backgroud_Image)
     wc.recolor(color_func = img_colors) #字体颜色为背景图片的颜色
     plt.imshow(wc) # 显示词云图
     plt.axis( 'off' ) # 是否显示x轴、y轴下标
     plt.show() #显示
     # 获得模块所在的路径的
     =  path.dirname(__file__)
     wc.to_file(path.join(d,  "wordAnalysis.jpg" ))
     print ( '生成词云成功!' )
 
worldCloud( 'date_rate_comment.txt' )

 其中:font_path='Font/SimSun.ttf',若有中文的话一定要加上,不然会出现方框,不显示汉字。SimSun.ttf这个文件可以从网上下载,放进Font这个文件夹下就可以了。

 

 

从词云分析来看,大家“力荐”、“推荐”的相当积极,广受好评。

总结

《武林外传》真的是一部轻松欢快的喜剧,值得大家拥有。

转载于:https://www.cnblogs.com/crawer-1/p/8328807.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值