栏目导航

电子游戏机和pc游戏

Python 爬虫实际:《战狼2》豆瓣影评剖析柒整头条

更新时间: 2018-01-04

起源:hang

segmentfault.com/a/1190000010473819

简介

刚打仗python未几,做一个小名目去练练脚。前几天看了《战狼2》,发明它正在最新上映的片子外面是排止第一的,以下图所示。筹备把豆瓣上对付它的影评做一个剖析。

目的总览

重要做了三件事:

抓取网页数据

清算数据

用词云进行展现

使用的python版本是3.5.

1、抓取网页数据

第一步要对网页进行拜访,python中使用的是urllib库。代码如下:

from urllib import request

resp = request.urlopen("")

htmldata = resp.read().decode("utf-8")

个中

htmldata是字符串类型的变度,里面存放了网页的html代码。

输入print(htmldata)可以查看,如下图所示:

第二步,需要对得到的html代码进行解析,获得里面提取我们需要的数据。

在python中应用BeautifulSoup库禁止html代码的剖析。

(注:如果没有安装此库,则使用pip install BeautifulSoup进行安装即可!)

BeautifulSoup使用的格局如下:

BeautifulSoup(html,"html.parser")

第一个参数为须要提与数据的html,第发布个参数是指定解析器,而后使用findall()读取html标签中的式样。

当心是html中有这么多的标签,该读取哪些标签呢?其真,最简略的措施是我们可以打开我们爬取网页的html代码,然后查看我们需要的数据在哪个html标签里面,再进行读取就可以了。如下图所示:

从上图中可以看出在div id=”nowplaying“标签入部属手是我们想要的数据,里面有电影的名称、评分、主演等信息。所以响应的代码编写如下:

from bs4 import BeautifulSoup as bs

soup = bs(htmldata, "html.parser")    

nowplayingmovie = soup.findall("div", id="nowplaying")

nowplayingmovielist = nowplayingmovie[0].findall("li", class="list-item")

其中nowplayingmovielist 是一个列表,可以用print(nowplayingmovielist[0])查看里面的内容,如下图所示:

在上图中可以看到data-subject属性里面放了电影的id号码,而在img标签的alt属性里面放了电影的名字,果此我们就经过进程那两个属性来获得电影的id和名称。(注:挨开电影短评的网页时需要用到电影的id,以是需要对它进行解析),编写代码如下:

nowplayinglist = []

for item in nowplayingmovielist:        

        nowplayingdict = {}        

        nowplayingdict["id"] = item["data-subject"]      

        for tagimgitem in item.findall("img"):            

            nowplayingdict["name"] = tagimgitem["alt"]            

            nowplayinglist.append(nowplayingdict)

个中列表nowplayinglist中就寄存了最新电影的id和称号,可以使用print(nowplayinglist)进行查看,如下图所示:

可以看到和豆瓣网址下面是婚配的。如许就失掉了最新电影的疑息了。接下来就要进行对最新电影短评进行分析了。比方《战狼2》的短评网址为:

其中26363254就是电影的id,start=0流露表示评论的第0条评论。

接上去接对应网址进行解析了。翻开上图中的短评页里的html代码,咱们收现对于批评的数据是在div标签的comment属性上面,如下图所示:

因而对此标签进行解析,代码如下:

requrl = "" + nowplayinglist[0]["id"] + "/comments" +"?" +"start=0" + "&limit=20"

resp = request.urlopen(requrl)

htmldata = resp.read().decode("utf-8")

soup = bs(htmldata, "html.parser")

commentdivlits = soup.findall("div", class="comment")

此时在commentdivlits 列表中存放的就是div标签和comment属性下面的html代码了。在上图中借可以发现在p标签下面存放了网友对电影的评论,如下图所示:

因此对commentdivlits 代码中的html代码持续进行解析,代码如下:

eachCommentList = [];

for item in commentdivlits:

        if item.findall("p")[0].string is not None:    

            eachCommentList.append(item.findall("p")[0].string)

使用print(eachCommentList)查看eachCommentList列表中的内容,能够看到里面存里我们念要的影评。如下图所示:

好的,至此我们已爬取了豆瓣比来播放电影的评论数据,接下来就要对数据进行浑洗和词云显示了。

2、数据清洗

为了便利进行数据进行荡涤,我们将列表中的数据放在一个字符串数组中,代码如下:

comments = ""

for k in range(len(eachCommentList)):

    comments = comments + (str(eachCommentList[k])).strip()

使用print(comments)进行查看,如下图所示:

可以看到贪图的评论曾经酿成一个字符串了,然而我们发现评论中另有很多的标面符号等。这些标记对我们进行词频统计时基本不用,因此要将它们肃清。所用的方式是正则抒发式。python中正则表达式是经由过程re模块来完成的。代码如下:

import re

 

pattern = re.compile(r"[一-�]+")

filterdata = re.findall(pattern, comments)

cleanedcomments = "".join(filterdata)

继绝使用print(cleanedcomments)语句进行查看,如下图所示:

我们可以看到此时评论数据中已经没有那些标点符号了,数据变得“清洁”了良多。

因此要进行词频统计,所以前要进行中文分词草拟。在这里我使用的是结巴分词。假如出有装置结巴分词,可以在把持台使用pip install jieba进行安拆。(注:可使用pip list查看是否是安装了这些库)。代码如下所示:

import jieba    #分词包

import pandas as pd  

 

segment = jieba.lcut(cleanedcomments)

wordsdf=pd.DataFrame({"segment":segment})

由于结巴分词要用到pandas,所以我们这里减载了pandas包。可使用wordsdf.head()查看分词以后的结果,如下图所示:

从上图可以看到我们的数据中有“看”、“太”、“的”等实词(停用词),而这些词在职何情形中皆是下频时,而且没有现实的含意,所以我们要他们进行扫除。

我把停用词放在一个stopwords.txt文明中,将我们的数据取停用词进行比对便可(注:只有在百量中输出stopwords.txt,就可能下载到该文件)。往停用词代码如下代码如下:

stopwords=pd.readcsv("stopwords.txt",indexcol=False,quoting=3,sep="",names=["stopword"], encoding="utf-8")#quoting=3齐不援用

wordsdf=wordsdf[~wordsdf.segment.isin(stopwords.stopword)]

继承使用wordsdf.head()语句来查看结果,如下图所示,停用词已经被进来了。

接下来就要进行词频统计了,代码如下:

import numpy    #numpy比赛争论包

wordsstat=wordsdf.groupby(by=["segment"])["segment"].agg({"计数":numpy.size})

wordsstat=wordsstat.resetindex().sortvalues(by=["计数"],ascending=False)

用wordsstat.head()进行检查,成果如下:

因为我们后面只是爬取了第一页的评论,所以数占有点少,在最后给出的完整代码中,我爬取了10页的评论,所数据还是有参考驾驶。

3、用词云进行显示

代码如下:

import matplotlib.pyplot as plt

%matplotlib inline

 

import matplotlib

matplotlib.rcParams["figure.figsize"] = (10.0, 5.0)

from wordcloud import WordCloud#伺候云包

 

wordcloud=WordCloud(fontpath="simhei.ttf",backgroundcolor="white",maxfontsize=80)#指定字体类别、字体巨细和字体色彩

wordfrequence = {x[0]:x[1] for x in wordsstat.head(1000).values}

wordfrequencelist = []

for key in wordfrequence:

    temp = (key,wordfrequence[key])

    wordfrequencelist.append(temp)

 

wordcloud=wordcloud.fitwords(wordfrequencelist)

plt.imshow(wordcloud)

此中simhei.ttf使用来指定字体的,可以在百度上输进simhei.ttf进行下载后,放进法式的根目次即可。隐示的图象如下:

到此为行,全部项目标先容便停止了。因为本人也仍是个入门者,接触python没有暂,代码写的实在欠好。并且第一次写技巧博客,表白的有些冗余,请各人多多原谅,有不对的处所,请大师批驳斧正。当前我也会将自己做的小项目以这类情势写在专宾上跟人人一路交换!最后揭上完全的代码。

完整代码

#coding:utf-8

author = "hang"

 

import warnings

warnings.filterwarnings("ignore")

import jieba    #分词包

import numpy    #numpy较劲争辩包

import codecs   #codecs供给的open办法来指定打开的文件的说话编码,它会在读取的时辰主动转换为外部unicode

import re

import pandas as pd  

import matplotlib.pyplot as plt

from urllib import request

from bs4 import BeautifulSoup as bs

%matplotlib inline

 

import matplotlib

matplotlib.rcParams["figure.figsize"] = (10.0, 5.0)

from wordcloud import WordCloud#词云包

 

#分析网页函数

def getNowPlayingMovielist():  

    resp = request.urlopen("")        

    htmldata = resp.read().decode("utf-8")    

    soup = bs(htmldata, "html.parser")    

    nowplayingmovie = soup.findall("div", id="nowplaying")        

    nowplayingmovielist = nowplayingmovie[0].findall("li", class="list-item")    

    nowplayinglist = []    

    for item in nowplayingmovielist:        

        nowplayingdict = {}        

        nowplayingdict["id"] = item["data-subject"]      

        for tagimgitem in item.findall("img"):            

            nowplayingdict["name"] = tagimgitem["alt"]            

            nowplayinglist.append(nowplayingdict)    

    return nowplayinglist

 

#爬取评论函数

def getCommentsById(movieId, pageNum):

    eachCommentList = [];

    if pageNum>0:

         start = (pageNum-1) * 20

    else:

        return False

    requrl = "" + movieId + "/comments" +"?" +"start=" + str(start) + "&limit=20"

    print(requrl)

    resp = request.urlopen(requrl)

    htmldata = resp.read().decode("utf-8")

    soup = bs(htmldata, "html.parser")

    commentdivlits = soup.findall("div", class="comment")

    for item in commentdivlits:

        if item.findall("p")[0].string is not None:    

            eachCommentList.append(item.findall("p")[0].string)

    return eachCommentList

 

def main():

    #轮回获得第一个电影的前10页评论

    commentList = []

    NowPlayingMovielist = getNowPlayingMovielist()

    for i in range(10):    

        num = i + 1

        commentListtemp = getCommentsById(NowPlayingMovielist[0]["id"], num)

        commentList.append(commentListtemp)

 

    #将列表中的数据转换为字符串

    comments = ""

    for k in range(len(commentList)):

      ,一起博娱乐;  comments = comments + (str(commentList[k])).strip()

 

    #使用正则表达式来除标点符号

    pattern = re.compile(r"[一-�]+")

    filterdata = re.findall(pattern, comments)

    cleanedcomments = "".join(filterdata)

 

    #使用结巴分词进行中文分词

    segment = jieba.lcut(cleanedcomments)

    wordsdf=pd.DataFrame({"segment":segment})

 

    #去失落停用词

    stopwords=pd.readcsv("stopwords.txt",indexcol=False,quoting=3,sep="",names=["stopword"], encoding="utf-8")#quoting=3全不引用

    wordsdf=wordsdf[~wordsdf.segment.isin(stopwords.stopword)]

 

    #统计词频

    wordsstat=wordsdf.groupby(by=["segment"])["segment"].agg({"计数":numpy.size})

    wordsstat=wordsstat.resetindex().sortvalues(by=["计数"],ascending=False)

 

    #用词云进行显著

    wordcloud=WordCloud(fontpath="simhei.ttf",backgroundcolor="white",maxfontsize=80)

    wordfrequence = {x[0]:x[1] for x in wordsstat.head(1000).values}

 

    wordfrequencelist = []

    for key in wordfrequence:

        temp = (key,wordfrequence[key])

        wordfrequencelist.append(temp)

 

    wordcloud=wordcloud.fitwords(wordfrequencelist)

    plt.imshow(wordcloud)

 

#主函数

main()

结果显示如下:

上图基础反应了《战狼2》这部电影的情形。

――――开班喜信――――

温馨提示:马哥教导Python自动化开辟班将于8月28日在北京海淀上天开班,小班造莫非式讲课,钜惠限时夺位中。

马哥教育2017年Python自动化运维开辟实战班,马哥结合BAT、豆瓣等一线互联网Python开发动人,依据今朝企业需要的Python开发人才进行了深度定制,参加了大批一线互联网公司:民众点评、饥了么、腾讯等出产情况实是项目,课程由浅入深,从Python根蒂基础到Python高等,让你融汇贯穿Python基础实践,手把手教学让你具有Python自动化开发需要的前端界面开发、Web框架、年夜监控体系、CMDB系统、认证碉堡机、自动化历程仄台六年夜实战才能,让您从0动手动手演变成Hold住年薪20万的Python自动化开发人才。

课程咨询请少按即可征询




友情链接:

Copyright 2017-2018 电子游戏机游戏 版权所有,未经协议授权禁止转载。