王嘉寶 雒偉群
(西藏民族大學(xué)信息工程學(xué)院,陜西 咸陽(yáng) 712082)
電影自誕生以來(lái)就一直是人們抒發(fā)觀點(diǎn)、記錄歷史、彰顯文明的一項(xiàng)重要的藝術(shù)形式。在互聯(lián)網(wǎng)飛速發(fā)展的今天,電影也從一條條膠卷變成了更加抽象的信息數(shù)據(jù)。在互聯(lián)網(wǎng)飛速發(fā)展的今天,如何將這些電影數(shù)據(jù)匯總起來(lái)進(jìn)行分析以便于人們更好的選擇電影,網(wǎng)絡(luò)爬蟲可以實(shí)現(xiàn)。
網(wǎng)絡(luò)爬蟲,是指按照一定規(guī)則,自動(dòng)機(jī)進(jìn)行抓取網(wǎng)絡(luò)信息操作的程序和腳本。世界上第一個(gè)網(wǎng)絡(luò)爬蟲程序是由麻省理工學(xué)院學(xué)生馬休·格雷于1993年編寫的“互聯(lián)網(wǎng)漫游者”[1]。隨著21世紀(jì)的到來(lái),信息的重要性愈發(fā)重要,我們稱21 世紀(jì)是信息時(shí)代,面對(duì)著互聯(lián)網(wǎng)這個(gè)信息的寶庫(kù),合理地利用其包含的信息是必要的?;ヂ?lián)網(wǎng)發(fā)展的全面提速,同時(shí)也促進(jìn)了網(wǎng)絡(luò)爬蟲的發(fā)展?,F(xiàn)如今有多種主流的爬蟲框架,例如Scrapy、PySpider、Apache Nutch、WebMagic 等等[2]。網(wǎng)絡(luò)爬蟲根據(jù)其作用范圍可分為3類:通用爬蟲、聚焦爬蟲和增量式爬蟲。通用爬蟲是對(duì)指定的頁(yè)面進(jìn)行全部數(shù)據(jù)的爬取。聚焦爬蟲在通用爬蟲的基礎(chǔ)上可以只爬取一張頁(yè)面中的部分?jǐn)?shù)據(jù),所得數(shù)據(jù)更加精簡(jiǎn)。增量式爬蟲屬于高階爬蟲,面對(duì)一些實(shí)時(shí)更新數(shù)據(jù)的頁(yè)面可以對(duì)其進(jìn)行同步的爬?。?]。這三種爬蟲在不同的環(huán)境下發(fā)揮著不同的作用。
在互聯(lián)網(wǎng)迅速發(fā)展的今天,網(wǎng)絡(luò)爬蟲所能夠?qū)崿F(xiàn)的已不僅僅是像個(gè)搬運(yùn)工一樣機(jī)械地根據(jù)指令需求去爬取數(shù)據(jù)。更像是識(shí)別圖片驗(yàn)證碼或是模擬鼠標(biāo)移動(dòng)來(lái)進(jìn)行點(diǎn)擊操作。過(guò)去在爬蟲時(shí)使用者是使用爬蟲去模擬瀏覽器,模擬一個(gè)網(wǎng)上存在的用戶去上網(wǎng),而今天的爬蟲,所模擬的是人類,模擬一個(gè)真人去上網(wǎng)??赡苣阍谀硹l微博熱搜下面看到的某條評(píng)論就是爬蟲程序發(fā)表的[4]。從其中可以看出爬蟲技術(shù)發(fā)展的速度之快,但是其發(fā)展也為我們帶來(lái)了新的思考,比如爬蟲的合法性如何界定?爬蟲功能的日益強(qiáng)大會(huì)帶來(lái)的威脅更大還是利益更大?網(wǎng)絡(luò)爬蟲是針對(duì)數(shù)據(jù)信息的一門技術(shù),由此決定了其特殊性。在爬取數(shù)據(jù)過(guò)程中不可避免會(huì)觸及到一些敏感數(shù)據(jù)或隱私,所以爬蟲與反爬蟲的斗爭(zhēng)一直存在。此外還有一些“君子協(xié)議”的存在,規(guī)定一些不可爬取的敏感或隱私數(shù)據(jù),由此對(duì)爬蟲使用者的行為進(jìn)行一定程度的約束。所以網(wǎng)絡(luò)爬蟲技術(shù)一定程度上屬于灰色技術(shù),其能帶來(lái)什么樣的結(jié)果全取決于使用者[5]。
Scrapy 框架,是Python 開(kāi)發(fā)的一個(gè)用于網(wǎng)絡(luò)數(shù)據(jù)爬取的框架。所謂框架,就是一個(gè)集成了很多功能并且有很強(qiáng)通用性的一個(gè)項(xiàng)目模板。Scrapy是Python封裝好提供的一個(gè)明星框架。相較于其他爬蟲框架,Scrapy 框架具有三個(gè)高性能:高性能持久化存儲(chǔ)操作,使數(shù)據(jù)的本地化存儲(chǔ)更方便;高性能異步的數(shù)據(jù)下載操作,提高數(shù)據(jù)爬取的效率和靈活性;高性能數(shù)據(jù)解析操作,使數(shù)據(jù)的解析分離輕松[6]。
Scrapy框架包括Spider類、引擎、下載器、調(diào)度器、項(xiàng)目管道和中間件6 大組件組成。6 大組件的相互配合實(shí)現(xiàn)了框架的數(shù)據(jù)爬取及其后續(xù)一系列操作。
引擎是整個(gè)框架的核心和數(shù)據(jù)流通的樞紐。此組件與其他各個(gè)組件都有著直接的交互聯(lián)系。引擎組件保證了所爬取數(shù)據(jù)在流通過(guò)程中的完整性和正確性,避免了數(shù)據(jù)流動(dòng)過(guò)程中可能出現(xiàn)的數(shù)據(jù)丟失或出錯(cuò)。
下載器是具體執(zhí)行數(shù)據(jù)爬取工作的組件。使用者所遞交的所有請(qǐng)求最終都由下載器來(lái)完成。
調(diào)度器是暫時(shí)存儲(chǔ)使用者請(qǐng)求的組件。通過(guò)暫時(shí)存儲(chǔ)請(qǐng)求來(lái)緩解引擎的壓力,避免引擎因?yàn)橥瑫r(shí)處理多個(gè)請(qǐng)求而進(jìn)行超負(fù)荷工作。
項(xiàng)目是對(duì)所爬取數(shù)據(jù)進(jìn)行一個(gè)映射,將爬取數(shù)據(jù)以類似于實(shí)體-屬性的方式進(jìn)行定義。由此可以更直觀的驗(yàn)證數(shù)據(jù)和去重?cái)?shù)據(jù),也能方便于后續(xù)的存儲(chǔ)操作。管道是將所爬取數(shù)據(jù)進(jìn)行本地存儲(chǔ)的組件。通過(guò)組件來(lái)存儲(chǔ)數(shù)據(jù)并進(jìn)行后續(xù)的分析操作。
中間件有下載器中間件、爬蟲中間件和調(diào)度器中間件。下載中間件介于引擎和下載器之間,可以對(duì)下載器抓取數(shù)據(jù)的過(guò)程進(jìn)行一定的自定義;爬蟲中間件介于Spider爬蟲類和引擎之間,可以對(duì)爬蟲類的Request請(qǐng)求進(jìn)行自定義和Response的過(guò)濾;調(diào)度中間件介于調(diào)度器和引擎之間,處理由引擎向調(diào)度器發(fā)送的請(qǐng)求和響應(yīng)。
在用Scrapy 框架創(chuàng)立項(xiàng)目之后框架會(huì)提供5 個(gè)Python 文件、一個(gè)Spider 文件夾和一個(gè)Scrapy 配置文件。5個(gè)Python文件包括用于標(biāo)識(shí)模塊包的init文件、item 項(xiàng)目文件、middlewears 中間件文件、pipelines管道文件和settings 設(shè)置文件。Spider 文件夾用于存儲(chǔ)Spider 類文件。首先在Spider 文件夾下通過(guò)終端指令創(chuàng)建一個(gè)Spider的Python文件。文件會(huì)自動(dòng)提供一個(gè)列表用于存放使用者所指定的URL 和一個(gè)parse 解析方法,使用者需要在列表中指定請(qǐng)求,即所需要爬取的URL。然后有引擎接收這些URL 并發(fā)送給調(diào)度器由調(diào)度器存儲(chǔ)起來(lái)。之后引擎以一定規(guī)則在調(diào)度器中調(diào)出請(qǐng)求發(fā)送給下載器由下載器根據(jù)請(qǐng)求在互聯(lián)網(wǎng)中爬取數(shù)據(jù)。下載器爬取下來(lái)的數(shù)據(jù)通常都是整張頁(yè)面的全部源碼數(shù)據(jù),這些數(shù)據(jù)過(guò)于粗糙,通常包含許多使用者并不需要的數(shù)據(jù)。因此下載器會(huì)將這些源碼數(shù)據(jù)打包交給引擎再由引擎交還給Spider 類。再根據(jù)Spider 中的使用者編寫的parse 函數(shù)里的操作進(jìn)行數(shù)據(jù)解析,過(guò)濾后使數(shù)據(jù)變得更精簡(jiǎn)。過(guò)濾后的數(shù)據(jù)以item 項(xiàng)目的形式提交給管道。最后由項(xiàng)目管道進(jìn)行存儲(chǔ)操作。由此一系列過(guò)程就完成了數(shù)據(jù)的爬取操作和存儲(chǔ)操作。之后就可以根據(jù)自身需求來(lái)對(duì)數(shù)據(jù)進(jìn)行分析等操作[7]。通過(guò)下圖可以直觀的感受Scrapy框架的工作流程。
Scrapy 框架的高性能可以使網(wǎng)絡(luò)數(shù)據(jù)的獲取變得更為方便,所以掌握使用Scrapy 框架是很有必要的。本文將爬取1905 電影網(wǎng)的電影數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行可視化來(lái)分析電影數(shù)據(jù)帶來(lái)的信息。
選取對(duì)1905 電影網(wǎng)的電影數(shù)據(jù)來(lái)爬取是因?yàn)閷?duì)其數(shù)據(jù)進(jìn)行爬取時(shí)在破解反爬蟲機(jī)制上的工作量相對(duì)較小甚至部分?jǐn)?shù)據(jù)沒(méi)有相關(guān)的反爬蟲機(jī)制來(lái)保護(hù)。數(shù)據(jù)的爬取工作會(huì)相對(duì)簡(jiǎn)單。網(wǎng)址為:https://vip.1905.com/list/p1o2.shtml。
3.1.1 Scrapy 框架安裝。本實(shí)驗(yàn)是基于Windows10 操作系統(tǒng)環(huán)境下進(jìn)行,使用Python語(yǔ)言,利用Pycharm 編寫程序。
首先需要安裝Scrapy 框架。在Windows 環(huán)境下,安裝Scrapy 框架需要先安裝Wheel。在Pycharm 終端中輸入指令:pip install wheel。然后下載twisted。這是因?yàn)镾crapy 框架提供的高性能的異步數(shù)據(jù)下載的操作是借助了twisted 實(shí)現(xiàn)的。安裝wheel也是為了下載和安裝twisted 可以順利進(jìn)行。這里提供一個(gè)twisted 的下載網(wǎng)址:https://www.lfd.uci.edu/~gohlke/pythonlibs/。在里面找到twisted 然后根據(jù)Python 的版本和計(jì)算機(jī)的操作系統(tǒng)位數(shù)進(jìn)行下載。下載完成后在終端中通過(guò)指令:pip install(后面接twisted 的版本名)。之后通過(guò)終端指令:pip install。
pywin32 安裝pywin32。最后安裝Scrapy 框架:pip install scrapy。安裝成功之后在終端中輸入指令:scrapy。如果沒(méi)有報(bào)錯(cuò)則安裝成功[8]。
3.1.2 電影數(shù)據(jù)的爬取及存儲(chǔ)。安裝好Scrapy 框架后就可以進(jìn)行電影數(shù)據(jù)的爬取了。首先創(chuàng)建一個(gè)Scrapy 項(xiàng)目。在Pycharm 終端中輸入指令:scrapy startproject doubanPro。然后創(chuàng)建一個(gè)爬蟲文件(即Spider類):scrapy genspider 1905m www.xxx.com。在創(chuàng)建爬蟲文件時(shí)可以先不指定URL,創(chuàng)建好之后在爬蟲文件中指定相關(guān)電影數(shù)據(jù)的URL。本次對(duì)1905 電影網(wǎng)的電影數(shù)據(jù)進(jìn)行爬取。分別對(duì)動(dòng)作、喜劇、文藝、戰(zhàn)爭(zhēng)、動(dòng)畫、科幻6個(gè)類型的內(nèi)地電影和歐美電影進(jìn)行爬取。每種類型爬取3 到4張頁(yè)面的數(shù)據(jù)。因?yàn)檫^(guò)多頁(yè)數(shù)的爬取可能會(huì)導(dǎo)致在請(qǐng)求量過(guò)大而爬取失敗。爬取相關(guān)電影的名稱、上映時(shí)間、評(píng)分、類型、地域5個(gè)屬性。使用瀏覽器所攜帶的抓包工具查看相關(guān)屬性所對(duì)應(yīng)的XPath 路徑。通過(guò)對(duì)頁(yè)面HTML 源碼的分析得知,在每張頁(yè)面中,每部電影都放在一個(gè)class 為“l(fā)ist clearfix_smile”的無(wú)序列表的li 標(biāo)簽中。通過(guò)XPath 定位最終可以得出每部電影的XPath 路徑:/html/body/div[1]/div/div[2]/div/ul/li。
拿到每部電影的XPath路徑后開(kāi)始對(duì)每部電影下的各項(xiàng)屬性進(jìn)行爬取。地域和類型屬性可以通過(guò)在網(wǎng)頁(yè)中選取相應(yīng)標(biāo)簽進(jìn)入到相應(yīng)頁(yè)面,因此在爬蟲程序中直接進(jìn)行賦值。例如爬取內(nèi)地的動(dòng)作電影,先通過(guò)網(wǎng)頁(yè)里的標(biāo)簽進(jìn)入到對(duì)應(yīng)頁(yè)面,然后再爬蟲文件中指定URL,并直接給地域和類型賦值為“內(nèi)地”和“動(dòng)作”。通過(guò)XPath 定位拿到名稱、上映時(shí)間和評(píng)分的XPath 路徑分別為:'./h3/a/span[@class="name"]//text()','./span[@class="fr score"]//text()',/h3/ a/ span[@class="hidden year"]//text()。拿到這些XPath 路徑后將這些數(shù)據(jù)一一對(duì)應(yīng)到item 中,提交至管道。之后在管道中將數(shù)據(jù)存儲(chǔ)到本地?cái)?shù)據(jù)庫(kù)中。數(shù)據(jù)庫(kù)使用MySQL數(shù)據(jù)庫(kù)。
MySQL 數(shù)據(jù)庫(kù)是一個(gè)開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),其具有安全、跨平臺(tái)、高效的優(yōu)點(diǎn)并且與Python緊密結(jié)合。MySQL數(shù)據(jù)庫(kù)由瑞典公司MySQL AB公司開(kāi)發(fā)、發(fā)布并支持。MySQL數(shù)據(jù)庫(kù)目前被廣泛應(yīng)用于中小型網(wǎng)站的開(kāi)發(fā)中。MySQL 數(shù)據(jù)庫(kù)也是目前運(yùn)行速度最快的SQL語(yǔ)言數(shù)據(jù)庫(kù)之一[9]。其功能的全面、強(qiáng)大以及免費(fèi)也是本次實(shí)驗(yàn)選擇MySQL數(shù)據(jù)庫(kù)的原因。
下面文本框的代碼是在管道中將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中的操作。之后在setting.py 文件中打開(kāi)管道。然后通過(guò)指令:scrapy crawl 1905m來(lái)運(yùn)行爬蟲。
表1 電影表
存儲(chǔ)的電影數(shù)據(jù)可以將數(shù)據(jù)進(jìn)行可視化操作,使用Python 提供的PYGAL 可以實(shí)現(xiàn)。生成的圖表可以存儲(chǔ)在本地。通過(guò)繪制各種圖表來(lái)分析電影的趨勢(shì)。
下圖兩張圖是分別以上映年份和電影類型為基準(zhǔn)所生成的折線圖。分別以上映年份和電影類型為標(biāo)準(zhǔn),求得所對(duì)應(yīng)的電影評(píng)分的平均值,繪制圖表。
在將數(shù)據(jù)進(jìn)行可視化之后,我們可以得到上面圖3、圖4兩張折線圖。通過(guò)對(duì)兩張折線圖的觀察來(lái)進(jìn)行數(shù)據(jù)分析得出結(jié)論。
通過(guò)對(duì)圖3進(jìn)行觀察分析發(fā)現(xiàn)在動(dòng)作、戰(zhàn)爭(zhēng)、動(dòng)畫三種類型中,我國(guó)內(nèi)地的電影平均評(píng)分是高于歐美等海外地區(qū)。這說(shuō)明這三類電影的質(zhì)量方面我國(guó)是具有一定優(yōu)勢(shì)的。我們中華民族刻在骨子里的武俠情懷也是一眾動(dòng)作電影的創(chuàng)作源泉,中國(guó)武術(shù)的深厚底蘊(yùn)也是孕育了無(wú)數(shù)經(jīng)典動(dòng)作電影的溫床。通過(guò)圖表可知我國(guó)戰(zhàn)爭(zhēng)題材的電影的平均評(píng)分是高于歐美等海外地區(qū)很多。在動(dòng)畫類電影方面我國(guó)也是高于歐美地區(qū)。雖然進(jìn)入21 世紀(jì)以來(lái)我國(guó)動(dòng)畫電影出現(xiàn)頹勢(shì),但通過(guò)圖表可分析出近些年來(lái)我國(guó)動(dòng)畫方面已逐漸開(kāi)始崛起,逐漸趕超歐美地區(qū)。喜劇類電影歐美地區(qū)高于內(nèi)地許多??苹妙愲娪皻W美地區(qū)是高于國(guó)內(nèi),但二者之間差距已不大,也說(shuō)明了近些年來(lái)我國(guó)科幻類電影的進(jìn)步。
為了確保更好地進(jìn)行分析,選取了自2010年起至2021 年約11 年左右的電影。通過(guò)對(duì)圖4 進(jìn)行觀察分析發(fā)現(xiàn),首先海內(nèi)外電影的總體質(zhì)量都呈下降趨勢(shì)。近些年來(lái),每年似乎都會(huì)誕生出幾部大家口碑一致的爛片,即使是口碑不錯(cuò)的電影在觀看之后也不會(huì)回味無(wú)窮。這也反映出電影行業(yè)的一些問(wèn)題。電影制作周期的縮短,編劇水平的落后,演員演技的不達(dá)標(biāo),流量當(dāng)?shù)赖娘L(fēng)氣都導(dǎo)致了電影質(zhì)量水平的下降。一部好的電影應(yīng)該是歷久彌新的,經(jīng)得起時(shí)間的沉淀。而今天,這種電影正在絕跡。但令人欣慰的是我國(guó)國(guó)內(nèi)的電影整體下降趨勢(shì)較好于歐美地區(qū)。而2020 年的新冠肺炎疫情使無(wú)論海內(nèi)外的電影行業(yè)都收到了沖擊,導(dǎo)致了電影的平均評(píng)分降至了最低點(diǎn)。而2018年的差距較大是因?yàn)閿?shù)據(jù)的不對(duì)稱導(dǎo)致。在爬取到的2018 年上映的電影中歐美地區(qū)只有1 部《UFO》,獲得6.7的評(píng)分。因此不足以說(shuō)明問(wèn)題。
雖然成功爬取到電影數(shù)據(jù)并進(jìn)行了分析,但還有可以優(yōu)化之處。例如沒(méi)有進(jìn)行反爬蟲機(jī)制的破解。選擇1905 電影網(wǎng)來(lái)進(jìn)行電影數(shù)據(jù)的爬取一定程度上也是因?yàn)闆](méi)有反爬蟲機(jī)制。如今的許多門戶網(wǎng)站都設(shè)置了反爬蟲機(jī)制,如果不針對(duì)這些反爬蟲機(jī)制進(jìn)行破解的話,很多情況下都是無(wú)法拿到足夠數(shù)量、滿意的數(shù)據(jù)。一些門戶網(wǎng)站會(huì)利用像是UA 識(shí)別、IP 地址識(shí)別、設(shè)置偽屬性和并發(fā)等機(jī)制來(lái)識(shí)別爬蟲的請(qǐng)求[10]。針對(duì)這些機(jī)制一些簡(jiǎn)單的方法像是設(shè)置下載間隔、隨機(jī)UA 和IP 池等方式可以進(jìn)行破解。但隨著互聯(lián)網(wǎng)的發(fā)展如今的反爬蟲機(jī)制越來(lái)越復(fù)雜,相應(yīng)的破解方法也應(yīng)運(yùn)而生。在后續(xù)的學(xué)習(xí)研究中將會(huì)對(duì)此方面深入研究學(xué)習(xí)。
此次爬蟲成功實(shí)現(xiàn)了電影數(shù)據(jù)獲取、數(shù)據(jù)解析、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)可視化的功能。并對(duì)數(shù)據(jù)進(jìn)行了簡(jiǎn)單的分析。利用Scrapy 框架對(duì)電影數(shù)據(jù)進(jìn)行爬取數(shù)據(jù),再通過(guò)對(duì)爬取到的數(shù)據(jù)進(jìn)行分析得出近些年來(lái)海內(nèi)外電影的整體走向,使我們?cè)谟^影使有了更好的數(shù)據(jù)依據(jù)。
此外,既然可以對(duì)電影數(shù)據(jù)進(jìn)行爬取,相應(yīng)的,類似于文章、音樂(lè)、圖片等信息數(shù)據(jù)也是可以進(jìn)行爬取。隨著網(wǎng)絡(luò)的蓬勃發(fā)展,爬蟲技術(shù)也必然會(huì)去適應(yīng)網(wǎng)絡(luò)的發(fā)展并催生出更多的以爬蟲為基礎(chǔ)的新興技術(shù),所以爬蟲技術(shù)未來(lái)也會(huì)有更大的發(fā)揮空間與更廣闊的前景。