?

基于豆瓣網某系列電影數據采集與可視化分析

2020-07-09 08:30黃蓉毛紅霞
現代信息科技 2020年23期
關鍵詞:網絡爬蟲數據采集可視化

黃蓉 毛紅霞

摘 ?要:文章基于Python程序設計實現了對豆瓣網站上《小時代》系列電影影評、劇照、歌曲的爬取,并針對爬取的影評做出相應的數據清洗以及數據可視化的展示。通過爬取豆瓣網站電影影評及相關劇照,分析大眾對電影的態度以及電影本身的特色,并對影評數據進行清洗,進而通過數據可視化的具體形式直觀的展現觀眾的評價,從而解釋某種關于影視作品的現象。

關鍵詞:網絡爬蟲;數據采集;影評;可視化

中圖分類號:TP393.09 ? ? 文獻標識碼:A 文章編號:2096-4706(2020)23-0004-04

Data Collection and Visual Analysis of a Series of Films Based on Douban.com

HUANG Rong,MAO Hongxia

(School of Computer and Software,Jincheng College of Sichuan University,Chengdu ?611731,China)

Abstract:Based on Python program design,this paper realized crawling of film reviews,stills and songs of Tiny Times series on Douban.com,and made corresponding data cleaning and data visual display for crawling of film reviews. Through crawling the film reviews and relevant stills on Douban.com,analyze the publics attitude towards the film and the characteristics of the film itself,and clean the film review data,and then intuitively show the audiences comments through the specific form of data visualization,so as to explain a certain phenomenon about film and television works.

Keywords:web crawler;data collection;film review;visualization

0 ?引 ?言

目前國內影視行業存在一種“爛片高票房”的現象,而《小時代》這個系列電影就是“爛片高票房”的一個典型例子,從《小時代》上映后就遭到很多著名的影評人的批評,大家一致認為這部影片質量不高,但仍有大部分人選擇花錢、花時間去觀看。為更好的解釋這一現象,筆者基于學校專業課程學習的Python內容與網絡爬蟲內容,選擇利用爬蟲技術對電影影評、劇照以及歌曲進行爬取,對電影本身及觀眾感受逐一分析,并通過可視化將數據展示出來。

1 ?數據采集

1.1 ?網絡爬蟲技術

網絡爬蟲又通常被人們稱為網頁蜘蛛,它是用特定規則去爬取靜態或者動態網頁中所需要的數據或內容的一種方法[1],換而言之網絡爬蟲的本質就是自動抓取網頁信息的一段代碼。爬取數據的基本過程可以分為四步,分別是:發送一個requests字樣請求,通過HTTP庫向目標服務器站點發送請求,等待對方服務器的響應;獲取響應內容,如果服務器能做出正常響應,那么就會得到一個response回應,里面所包含的內容便是希望得到的網頁頁面內容;解析網頁內容,由于得到的內容可能是HTML代碼,一般需要用到正則表達式或者XPath等等進行網頁解析;保存需要的數據,可以將內容存為文本、表格,也可以保存在數據庫里。本文所用方法是基于Python語言進行的網頁數據爬取,利用Python本身提供的眾多數據庫,高效、精準的進行網頁抓取、網頁解析、數據存儲等操作[2]。

1.2 ?應對反爬策略

爬蟲的速度是遠遠高于人類的速度的,所以在使用爬蟲的時候會占用相當一大部分服務器的帶寬,這就增大了服務器的負載,甚至在大量用戶訪問的情況下會造成網絡擁堵,并且如果網絡爬蟲被濫用,會出現網絡上數據內容雷同甚至一模一樣的情況,使得原創作品得不到保護,于是,很多網頁會設置反爬蟲機制,來打破這樣的局面。那么當用戶真正需要爬取數據的時候,就必須對爬蟲進行偽裝。以下便是本項目應對反爬的策略:

(1)偽裝用戶代理,將請求頭部User-Agent字段改為瀏覽器的User-Agent后再發送請求User-Agent[3]。

(2)設定休眠時間,人為瀏覽網頁總是會停頓幾秒,為了使爬蟲與人類相似,一般在爬取的時候會將爬蟲設置特定的休眠時間從而模擬人為登錄狀態[4],由此會使用time庫中的sleep函數,在Selenium登入時模擬用戶的點擊延時行為。

(3)使用代理IP訪問網站,豆瓣網頁在爬蟲頻繁登陸后會封禁該IP一段時間,而利用代理IP,使得同一IP訪問豆瓣服務器的頻率相對減小,服務器難以檢測[5],避免IP被封。

(4)偽裝Cookie,一般情況下,網站會通過檢驗請求信息中是否存在Cookie,以及利用Cookie的值來判斷該請求到底是真實用戶還是爬蟲[6],所以需要在用戶某次登錄時獲取Cookie,將其加入到請求頭中,達到模仿用戶登錄獲取數據的效果。

1.3 ?模擬登錄豆瓣網

模擬登錄網頁通常有兩種方式,一種是requests請求,一種是Selenium模擬瀏覽器自動登錄,本項目選擇第二種方式登錄豆瓣網。第一步,找到登錄界面的網址,利用driver= webdriver.Chrome()啟動瀏覽器,將找到的網址放入driver.get()方法中;第二步,利用driver.find_element_by_xpath()方法定位到密碼登錄的位置:用f12打開開發工具,利用鼠標點擊可以找到其位置,代碼表示為://*[@id="account"]/div[2]/div[2]/ div/div[1]/ul[1]/li[2];第三步,依次定位賬號密碼框,利用send_keys()輸入內容,第四步,獲取登錄按鈕的位置,click()點擊登錄即完成模擬登錄。

主要代碼為:

#點擊密碼登陸,豆瓣登陸框默認手機號登陸

password_login=driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]')

password_login.click()

#找到賬號框

username=driver.find_element_by_css_selector('#username')

username.click()

username.clear()

username.send_keys('***')

time.sleep(2)

#找到密碼框

password=driver.find_element_by_css_selector('#password')

password.click()

password.clear()

password.send_keys('***')

time.sleep(2)

#找到登錄框

submit=driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a')

print('準備登陸...')

submit.click()

time.sleep(5)

1.4 ?影評爬取

在影評爬取之前,需要找到電影的鏈接,因為《小時代》系列電影有四部,所以考慮利用Selenium定位獲取四部電影的名字以及鏈接,在利用Selenium自動搜索電影名稱的時候,發現當跳出新窗口時,driver定位的還是上一個窗口展現的頁面,導致不能正確的輸入想要的字段使得結果報錯或者元素定位錯誤,所以利用driver.window_handles[1]切換頁面句柄,讓driver自動定位到新的窗口上,最后將名字和鏈接存放在字典里一一對應。每部電影需要爬取前500條數據,每頁有20條數據,則需要爬取25頁,這里涉及到翻頁處理問題,通過網頁鏈接的規律可知,在這25頁中,只有start的值在發生變化,則可以用循環語句來代替人工翻頁,代碼為:link=v+'comments?start={}&limit=20&status=P&sort=new_score'.format(page*20),這里的page表示0到24,v

代表前面電影的鏈接,然后用xpath提取所需要的內容,具體代碼為:

l = s.get(url=link, headers=headers,proxies=proxies)

html = l.content.decode('utf-8')

html = etree.HTML(html, parser=etree.HTMLParser (encoding='utf-8'))

#名字

host = html.xpath('//span[@class="comment-info"]/a/text()')

# 評分

gra = html.xpath('//span[@class="comment-info"]/span[2]/@title')

#內容

for c in range(1, 21):

con=html.xpath('//*[@id="comments"]/div[{}]/div[2]/p/span/text()'.format(c))

1.5 ?劇照爬取

在爬取劇照時,同樣涉及到翻頁問題,網頁鏈接的規律與影評一致,都是只有start參數改變,可將翻頁處理寫成:url_photo=v+photos?type=S&start={}&sortby=like&size=a&subtype=a'.format(page * 30),主要代碼為:

# 解析網頁

print("開始爬取{}頁".format(page + 1))

response = requests.get(url_photo, headers=headers,proxies=proxies)

if response.status_code == 200:

soup = BeautifulSoup(response.text, "lxml")

imgTags = soup.find_all("div", attrs={"class": "cover"})

# 獲取圖片鏈接以及名字

for imgTag in imgTags:

src = imgTag.img.get("src")

name = imgTag.parent.get("data-id") + movie_name[i]

# print(src)

resp = requests.get(src, headers=headers,proxies=proxies)

1.6 ?音樂爬取

音樂與影評、劇照所不同的是,四部電影音樂總和較少,一共15條,所以不涉及翻頁處理,直接在音樂界面獲取即可,代碼為:

def get_message(response):

html=response.content.decode('utf-8')

html=etree.HTML(html,parser=etree.HTMLParser (encoding='utf-8')) res_url=html.xpath(r'//*[@id="content"]/div/div[1]/div[3]/div[2]

//a/@href')#網址 res_song=html.xpath(r'//*[@id="content"]/div/div[1]/div[3]/div[2]//a/text()')#歌名

res_text=html.xpath(r'//*[@id="content"]/div/div[1]/div[3]/div[2]//p/text()')#歌曲簡介

return res_song,res_text,res_url

2 ?數據清洗

在數據收集時或者收集之后需要對其進行清洗,為后續數據可視化做準備,對此,本項目采用的數據清洗步驟為:

(1)在爬取影評時,因為數據較多,循環過程中,利用xpath定位的節點位置有時會不一致:評分為空時節點位置是沒有顯示的,會導致抓取的元素為日期。為評分出錯,導致后面無法分析,在抓取時直接利用循環遍歷,將錯誤元素賦值為null,具體代碼為:

grade = []

for i in gra:

if len(i) > 4:

i = "null"

grade.append(i)

(2)影評主要由作者,評分和內容三部分組成,如果內容存在缺失,不僅會導致錯位,而且會導致最終一一對應時報錯,則需要對每一頁內容循環遍歷,如若為空列表,則賦值為null,具體代碼為:

content = []

for c in range(1, 21):

con=html.xpath('//*[@id="comments"]/div[{}]/div[2]/p/span/text()'.format(c))

if con == []:

con = ['null']

content.append(con[0])

(3)對于爬取下來的評分等級,需要進行計數處理,方便之后的可視化展示,則需要用到pandas的value_counts()方法對等級進行計數統計,其方法可以自動忽略空值,并且也避免了if…else的冗余。

3 ?數據可視化

3.1 ?數據可視化的作用

數據可視化的作用可以體現在多方面,而本項目則主要有以下三個作用,分別為:

(1)更加直觀的參觀數據,比如利用餅圖來分析評分等級,繁冗的文字數據就被圖形替代,能直觀看到大眾對電影的評價分布。

(2)統計效率更快,比如利用jieba庫分詞來統計詞頻,與人工統計相比,速度提升了不少。

(3)更加美觀的展現數據,在(2)的基礎上,如果想要統計出來的詞頻以特定形態呈現出來,那么就需要用到imageio庫,否則它的形狀就是一個普通的矩形。

3.2 ?設計需求

在如今的大信息時代,數據量急劇增加,數據本身的信息價值被不斷沖刷,導致有價值的信息被無價值的信息淹沒,所以我們需要一種更形象、具體的方式來處理這些數據,使得有價值的信息被展現出來,而數據可視化就完全符合要求。從某種意義上來說,數據可視化就是尋找數據本身中隱藏的某種規律及現象,通過圖表的方式來總結復雜數據,要比書面信息更利于人腦的吸收[7]。所以本項目對數據做了以下處理:

對爬取下來的每部電影前500條,四部共2 000條短評內容存入csv文件,然后讀取評分等級那一列數據,利用pandas的value_counts()方法對五個不同的評分等級“很差、較差、還行、推薦、力薦”進行數據統計,由得到的統計數據繪制餅圖來體現大家對《小時代》系列的評星看法。

運用jieba庫對爬取到的短評內容進行詞頻統計,將統計結果存入txt文件,再利用wordcloud庫繪制詞云圖,然后用Matplotlib庫出現頻率排行前十的詞語做一個直方圖的繪制。

3.3 ?相關技術

數據可視化部分利用codecs.open(filepath,method,encoding)打開文件;jieba庫進行分詞便于后續利用wordcloud做詞云圖,利用Imageio控制詞云圖形狀。最后利用matplotlib庫做數據的條形圖draw_barh()、餅圖draw_pie()。

3.4 ?具體實現

3.4.1 ?詞頻條形圖

利用jieba中文詞庫自動進行分詞處理,并利用Counter()方法統計其出現的次數,將非中文字符的分詞刪除,將處理好的詞頻存放在文件里面并繪制頻率為前十的條形圖,條形圖的X軸設置為出現次數,呈現方式如圖1所示。

3.4.2 ?詞云圖

為了將之前分割的詞以特定的形式呈現出來,需要使用一張背景圖片來加工,利用pac_mask = imageio.imread (r'xiaoshidai.png')增加一個背景圖片,并在WordCloud()中加入參數mask,以此可自定義繪制詞云圖,呈現形式如圖2所示。

3.4.3 ?餅圖

由數據清洗得到大眾對電影的5個等級,用這5個等級繪制出餅圖,突出顯示百分比最高的一個等級,呈現形式如圖3所示。

3.5 ?可視化結論

利用餅圖繪制評分等級后發現等級為“很差”的占比最多,這說明在大眾心里這一系列電影無疑是非常爛的電影,利用jieba詞庫及條形圖統計出來影評中高頻率詞語中有作者人名,同時他也是這系列劇的導演,據了解,他之前是一名青春文學作家,不少人讀過他的小說,算得上是他的粉絲,可以說名氣很大,意味著可能大部分觀眾是沖著這位名氣甚大的作家去看的;通過抓取下來的劇照可以發現,劇中場景華麗,明星陣容超強,通過抓取下來的歌曲可以發現,演唱者大多在當時名氣不小,正是因為有了強大的粉絲團以及明星效應引起的轟動,再加上小說的渲染,才成就了這系列電影的高票房。這也就是為什么如今頻繁出現爛片高票房的原因了。

4 ?結 ?論

本文以豆瓣網站《小時代》系列電影為例,完成了對特定主題網絡爬蟲的數據采集、數據清洗以及數據可視化展示三部分,闡明了具體的設計背景以及設計思路,并編寫完成了數據采集、數據清洗、數據可視化三個部分的代碼。根據對系列電影影評、劇照及音樂的爬取,對其數據進行清洗并將部分數據進行可視化分析,可以解釋部分影視作品評價不高卻任然能夠吸引觀眾去觀看。因為在爬取影評時內容較多,雖然在代碼中加入了多線程爬蟲,但可以后期加以調試,對比得到時間花費較短的結果,以此來提高網絡爬蟲的效率。另外豆瓣網在同一賬戶登錄頻率較高時會設置滑塊驗證,本項目雖然利用了Selenium模擬瀏覽器進行自動登錄,但是不能解決滑塊驗證即還會手動點擊滑塊獲取驗證,針對這一問題,后期可以通過自主學習,設計全自動化板塊,以此來消除人工參與問題,達到自動化效果,進而提升效率。

參考文獻:

[1] 溫佐承,賈雪.基于Python的網絡爬取 [J].電腦編程技巧與維護,2020(12):23-24+32.

[2] 趙文杰,古榮龍.基于Python的網絡爬蟲技術 [J].河北農機,2020(8):65-66.

[3] 劉石磊.對反爬蟲網站的應對策略 [J].電腦知識與技術,2017,13(15):19-21+23.

[4] 伏康,杜振鵬.網站反爬蟲策略的分析與研究 [J].電腦知識與技術,2019,15(28):28-30.

[5] 陳利婷.大數據時代的反爬蟲技術 [J].電腦與信息技術,2016,24(6):60-61.

[6] 張巖.大數據反爬蟲技術分析 [J].信息系統工程,2018(8):130.

[7] 朱寅非.數據可視化應用領域及作用 [J].電子技術與軟件工程,2020(16):149-150.

作者簡介:黃蓉(1999—),女,漢族,四川成都人,本科在讀,研究方向:大數據分析;毛紅霞(1981—),女,漢族,寧夏石嘴山人,副教授,碩士,研究方向:大數據、人工智能。

猜你喜歡
網絡爬蟲數據采集可視化
數據可視化設計在美妝類APP中的應用
思維可視化
復變函數級數展開的可視化實驗教學
復變函數級數展開的可視化實驗教學
復變函數共形映射的可視化實驗教學
復變函數共形映射的可視化實驗教學
煉鐵廠鐵量網頁數據獲取系統的設計與實現
基于廣播模式的數據實時采集與處理系統
通用Web表單數據采集系統的設計與實現
基于開源系統的綜合業務數據采集系統的開發研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合