Python 爬蟲實戰(1):分析豆瓣中最新電影的影評


 

目標總覽

主要做了三件事:

  • 抓取網頁數據
  • 清理數據
  • 用詞雲進行展示
  • 使用的python版本是3.6

一、抓取網頁數據

第一步要對網頁進行訪問,python中使用的是urllib庫。代碼如下:

from urllib import request

resp = request.urlopen('https://movie.douban.com/nowplaying/hangzhou/')
html_data = resp.read().decode('utf-8')

其中https://movie.douban.com/nowplaying/hangzhou/是豆瓣最新上映的電影頁面,可以在瀏覽器中輸入該網址進行查看。

html_data是字符串類型的變量,里面存放了網頁的html代碼。

輸入print(html_data)可以查看,如下圖所示:

第二步,需要對得到的html代碼進行解析,得到里面提取我們需要的數據。

在python中使用BeautifulSoup4庫進行html代碼的解析(如果沒有安裝此庫,請先自行安裝)。

BeautifulSoup使用的格式如下:

BeautifulSoup(html,"html.parser")

第一個參數為需要提取數據的html,第二個參數是指定解析器,然后使用find_all()讀取html標簽中的內容。

但是html中有這么多的標簽,該讀取哪些標簽呢?其實,最簡單的辦法是我們可以打開我們爬取網頁的html代碼,然后查看我們需要的數據在哪個html標簽里面,再進行讀取就可以了。如下圖所示:

從上圖中可以看出在div id=“nowplaying”標簽開始是我們想要的數據,里面有電影的名稱、評分、主演等信息。所以相應的代碼編寫如下:

soup = bs(html_data, 'html.parser')
nowplaying_movie = soup.find_all('div', id='nowplaying')
nowplaying_movie_list = nowplaying_movie[0].find_all('li', class_='list-item')

其中nowplaying_movie_list是一個列表,可以用print(nowplaying_movie_list[0])查看里面的內容,如下圖所示:

在上圖中可以看大data-subject屬性里放了電影的id號碼,而在img標簽的alt屬性里面放了電影的名字,因此我們就通過這兩個屬性來得到電影的id和名稱。(注:打開電影短評的網頁時需要用到電影的id,所以需要對它進行解析),編寫代碼如下:

nowplaying_list = []
for item in nowplaying_movie_list:
    nowplaying_dict = {}
    nowplaying_dict['id'] = item['data-subject']
    for tag_img_item in item.find_all('img'):
        nowplaying_dict['name'] = tag_img_item['alt']
        nowplaying_list.append(nowplaying_dict)

其中列表nowplaying_list中就存放了最新電影的id和名稱,可以使用print(nowplaying_list)進行查看,如下圖所示:

可以看到和豆瓣網址上面是匹配的。這樣就得到了最新電影的信息了。接下來就要進行對最新電影短評進行分析了。例如《侏羅紀公園2》的短評網址為:https://movie.douban.com/subject/26416062/?from=playing_poster其中26416062就是電影的id。

接下來對該網址進行解析了。打開上圖中的短評頁面的html代碼,我們發現關於評論的數據是在div標簽的comment屬性下面,如下圖所示:

因此對此標簽進行解析,代碼如下:

requrl = 'https://movie.douban.com/subject/' + nowplaying_list[0]['id'] + '?from=playing_poster'
resp = request.urlopen(requrl)
html_data = resp.read().decode('utf-8')
soup = bs(html_data, 'html.parser')
comment_div_list = soup.find_all('div',class_='comment')

此時在comment_div_list列表中存放的就是div標簽和comment屬性下面的html代碼了。在閃圖張還可以發現在p標簽下面存放了網友對電影的評論,因此對comment_div_list代碼中的html代碼繼續進行解析,代碼如下:

eachCommentList = []
for item in comment_div_list:
    if item.find_all('p')[0].string is not None:
        eachCommentList.append(item.find_all('p')[0].string)

使用print(eachCommentList)查看eachCommentList列表中的內容,可以看到里面存着我們想要的影評。如下圖所示:

至此我們已經爬取了豆瓣最近播放電影的評論數據,接下來就要對數據進行清洗和詞雲顯示了。

二、數據清洗

為了方便數據進行清洗,我們將列表中的數據放在一個字符串數組中,代碼如下:

comments = ''
for k in range(len(eachCommentList)):
    comments = comments + (str(eachCommentList[k])).strip()

使用print(comments)進行查看,如下圖所示:

可以看到所有的評論已經變成一個字符串了,但是我們發現評論中還有不少的標點符號等。這些符號對我們進行詞頻統計時根本沒有用,因此要將它們清除。所用的方法是正則表達式。python中正則表達式是通過re模塊來實現的。代碼如下:

import re
pattern = re.compile(r'[\u4e00-\u9fa5]+')
filterdata = re.findall(pattern, comments)
cleaned_comments = ''.join(filterdata)

繼續使用print(cleaned_comments)語句進行查看,如下圖所示:

我們可以看到此時評論數據中已經沒有那些標點符號了,數據變得“干凈”了很多。

 因此要進行詞頻統計,所以先要進行中文分詞操作。在這里我使用的是結巴分詞。如果沒有安裝結巴分詞,可以在控制台使用pip install jieba進行安裝。(注:可以使用pip list查看是否安裝了這些庫)。代碼如下所示:

import jieba    # 分詞包
import pandas as pd

segment = jieba.lcut(cleaned_comments)
words_df = pd.DataFrame({'segment': segment})

因為結巴分詞要用到pandas,所以我們這里加載了pandas包。可以使用words_df.head()查看分詞之后的結果,如下圖所示:

從上圖可以看到我們的數據中有“別的”、“不”、“讓”、“我”等虛詞(停用詞),而這些詞在任何場景中都是高頻時,並且沒有實際的含義,所以我們要他們進行清除。

我把停用詞放在一個stopwords.txt文件中,將我們的數據與停用詞進行比對即可(注:只要在百度中輸入stopwords.txt,就可以下載到該文件)。去停用詞代碼如下代碼如下:

stopwords = pd.read_csv('stopwords.txt', index_col=False, quoting=3, sep='\t', names=['stopword'], encoding='gbk') # quoting=3全部引用
words_df = words_df[~words_df.segment.isin(stopwords.stopword)]

繼續使用words_df.head()語句來查看結果,如下圖所示,停用詞已經被出去了。

 

接下來就要進行詞頻統計了,代碼如下:

import numpy  # numpy計算包

words_stat = words_df.groupby(by=['segment'])['segment'].agg({"計數": numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["計數"], ascending=False)

words_stat.head()進行查看,結果如下:

 

由於我們前面只是爬取了第一頁的評論,所以數據有點少,在最后給出的完整代碼中,我爬取了10頁的評論,所數據還是有參考價值。

三、用詞雲進行顯示

未完待續!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM