美文网首页python爬虫入门看这个就够了大数据 爬虫Python AI Sql
不优雅地用小数据告诉你——当人们讨论《肖申克的救赎》都在讨论什么

不优雅地用小数据告诉你——当人们讨论《肖申克的救赎》都在讨论什么

作者: bellay | 来源:发表于2017-12-13 19:47 被阅读66次

    作为marketing小小白,怎么能对Python一无所知?!于是就有了这一次让我急剧脱发的尝试,心疼一下自己的发际线。

    一开始只是想随意用豆瓣试一下,打开排名第一的就是《肖申克的救赎》,于是极其不郑重的走上了脱发之旅。爬的是短评,当然了其实长评和短评并没有太大区别。

    1.爬取评论,先尝试爬取第一页评论内容

    爬虫主要借助Python的BeautifulSoup。


    url='https://movie.douban.com/subject/1292052/comments?status=P'

    douban=requests.get(url)

    print(douban)

    soup=BeautifulSoup(douban.text, 'lxml')

    for p in soup.select('p'):

    print(p.text)

    outlist=[p.text]


    以上代码中的p是检查网页发现,评论都存储在div下面的p里。

    但是这里是有一点问题的,就是只有第一页的评论。记得yuqi给我们做tutorial的时候讲过网址的构成,只需要找到网址的固定部分和page改变的部分,所以只要设个循环把网址output一下就好。


    import csv

    i=1

    while i <=100:#本来设置应该爬2000条数据,但是后来。。。都是泪

    url='https://movie.douban.com/subject/1292052/comments?'+('start=%d&limit=20&sort=new_score&status=P&percent_type='%(int(20*i)))#可以看出来每一页设置是20条评论,改变的只有start后面的内容

    i+=1

    douban2=requests.get(url)

    soup=BeautifulSoup(douban2.text, 'lxml')

    for p insoup.select('p'):

    print(p.text)

    outlist=[p.text]

    with open('douban.csv', 'a+', encoding='UTF-8')as csvfile:

    doubanwriter=csv.writer(csvfile)

    doubanwriter.writerow(outlets)


    最后一行,将爬下来的内容保存在名为douban的csv文件里(关于写入写出csv,真的有必要好好学一下,搞定数据发现写不出来真的是要哭出来)。有看CSDN论坛上一些大牛的爬虫,用了很多def函数,对比一下自己的真的是极其业余的爬虫了。但是其实豆瓣页面还是挺友好的,我在没设置header的情况下还是可以爬一爬。

    2.清理数据

    爬取完,会发现结果有个bug,应该是因为p里面也同时放进了《肖申克救赎》的简介,所以有一些内容是这样的:


    >去肖申克的救赎的页面

    导演:

    弗兰克·德拉邦特

    主演:

    蒂姆·罗宾斯/摩根·弗里曼/鲍勃·冈顿/威廉姆·赛德勒/克兰西·布朗/吉尔·贝罗斯/马克·罗斯顿/詹姆斯·惠特摩/杰弗里·德曼/拉里·布兰登伯格/尼尔·吉恩托利/布赖恩·利比/大卫·普罗瓦尔/约瑟夫·劳格诺/祖德·塞克利拉

    类型:

    犯罪,剧情

    地区:

    美国

    片长:

    142

    分钟

    上映:

    1994-09-10(

    多伦多电影节),

    1994-10-14(美国)

    豆瓣我们的精神角落扫码直接下载


    所以后期再做情感分析的时候会先清洗一下。因为文本相对简单,检测过,基本没有空值,所以把重复的值扔掉基本就完成了;至于更复杂一点的数据方面的。。。。我们来年再见


    loandata2=loandata.drop_duplicates()

    loandata2.to_csv('doubancomment.csv)#


    重新写入名为doubancomment的文件,或者存为excel文件也可以。(学习导出真的hin重要啊,后面情感分析的数据还是float的没办法直接用to_csv,摸摸发际线)

    ##在这里发现一个问题就是,短评只爬下来200多条,em,有点愧对big data;然后直接刷网页也发现,说我无权限,所以说保险起见还是加headers比较好。

    3.词云

    此代码来自CSDN论坛(墙推),毕竟是中文,比GitHub好理解。


    import matplotlib.pyplot as plt

    from wordcloud import WordCloud

    import jieba

    text_from_file_with_apath= open('/Users/hecom/23tips.txt').read()

    wordlist_after_jieba =jieba.cut(text_from_file_with_apath, cut_all = True)

    wl_space_split = " ".join(wordlist_after_jieba)

    my_wordcloud =WordCloud().generate(wl_space_split)

    plt.imshow(my_wordcloud)

    plt.axis("off")

    plt.show()


    以上转自CSDN论坛的十行代码,然而,我出来的结果是

    发现只有英文被显示出来了,其实这个和中文编码是没有关系的,是wordcloud本身的问题,所以需要重新下载一个中文字体,然后应用到词云里去。这里贴一个网址,https://zhuanlan.zhihu.com/p/28954970 我觉得很方便的是它把中文的字体下载链接也给出来啦。恩。。是有点丑,不过也可以下载不同的字体,至于细节,来年再见(摸摸发际线)

    当然之前pre-term的时候老师也推荐过一个网址,wordclouds.com,简直机智的词云网站,做出来的效果就是文章开始的样子~但是这里要注意一个问题,如果整个文本粘进去说不定出来的词云就不是以一个词一个词出现的,而是一个句子一个句子的(毕竟是短评),所以建议可以在切过词以后再去做词云。切词可以很方便地用Python里的jieba包,就是上面代码里的wordlist_after_jieba,存成csv或者excel文件都可以。

    4.情感分析

    这一步我真的经历了很长的挣扎过程,遇到了各种bug,比如用来做情感分析的snownlp没办法进行assign,float类型数据没法直接to_csv,pandas包的赋值,怎么把评论和每条对应的情感分析放到同一个文件中进行导出,列表字典str的应用等等等等。(摸摸发际线)

    冷静下来,先从最基础的开始。做中文的情感分析用的是Python中的snownlp包,英文的用的是textblob,相比而言,做英文的简直简单更多。所以第一步先把comment打开


    csvFile = open("comment.csv","r")#打开csv文件,r代表的是只读格式

    reader = csv.reader(csvFile)

    result={}#新建一个字典result用来装comment

    for item in reader:

    #忽略第一行

    if reader.line_num == 1:

    continue

    result[item[0]] = item[1]

    csvFile.close()

    print(result)


    导入comment文件之后,就要思考怎么对每一条comment进行情感分析,所以我研究了一堆网址之后发现,直接用字典导出最方便!

    最后导出数据是这样的

    em,会看到格式是"0":"我们的精神角落",这个就是字典的储存格式,是比较方便的可以用于后续进行提取的。

    然后就会遇到另一个问题,就是,要对这么多评论挨个进行分析,而snownlp不支持分配怎么办。这时候就要发挥伟大的字典了。


    from snownlp import SnowNLP

    result2={}#新建一个叫result2的字典

    for i in result.keys():

    result2['%s'%(i)]=SnowNLP(result['%s'%(i)]).sentiments

    print(result2)


    不要看说起来用字典很轻松,我真的摸着头发摸了两天才有这个想法。哭了。后面会发现用字典简直不要太机智,因为这两个字典用的key是相同的。

    ##导出来的字典是可以直接to_csv的。

    下面的问题就是,这是两个字典啊,需要合并到一起怎么办。这时候就要赞叹一下自己的机智就是上面提到的两个字典的key相同。(不要问我如果不同怎么办,因为我估计也不知道)这时候可以用到Python的pandas包。


    import pandas as pd

    df1=pd.DataFrame(result,index=result.keys(),columns=['comment','score'])#新建一个叫df1的data frame ,有点类似表格;横向就是index,还是用刚刚字典的key,有两列分别是comment和score(情感分析得分)

    df1['comment']=pd.Series(result,index=result.keys())#对df1进行赋值,comment是result的内容

    df1['score']=pd.Series(result2,index=result.keys())#同上,score是result2的内容

    df1.to_csv('xiaoshenke.csv')


    最后得到如下的结果

    看到这个结果简直要哭出声来。至此,一段非常业余的爬虫分析结束了。

    5.mac打开中文乱码?

    这个问题其实上学期爬微博就遇到了,这次我很深刻的去找了下原因,大概就是编码的问题。虽说Python支持utf-8的编码,但是excel其实不支持的,所以我们要把整个文件改成excel能够识别的,也就是GB18030。

    在终端里输入(适用mac)亲测可用


    iconv -f UTF-8 -t GB18030douban.csv>douban2.csv


    6.总结

    圣诞要到了,香港圣诞气氛还是很重的,希望大家圣诞过来,保重发际线,用霸王不脱发!

    相关文章

      网友评论

      • 295b2f58006a:刚刚下载就来评论你,知道为什么吗?

        因为你太棒了!!!!加油!!
        bellay:哈哈哈哈!抱抱!么么!!

      本文标题:不优雅地用小数据告诉你——当人们讨论《肖申克的救赎》都在讨论什么

      本文链接:https://www.haomeiwen.com/subject/bxuaixtx.html