王海玲 周志彬
摘 要:利用Python編程語言的Scrapy框架,為貓眼網(wǎng)站設(shè)計一個網(wǎng)絡(luò)爬蟲程序,對貓眼網(wǎng)頁中《復(fù)仇者聯(lián)盟4》的用戶評論進行抓取。對抓取下來的網(wǎng)頁信息進行信息提取,并將有用信息轉(zhuǎn)換為dataframe格式存儲到csv文件中;再將csv文件中的數(shù)據(jù)通過Pandas庫進行提取排列,并利用Pyecharts庫生成可視化圖表的html頁面;最后修改url中的setoff屬性,通過改變starTtime的值,成功獲取了更多評論。結(jié)果表明,比正常獲取評論數(shù)的最大值990條多了16倍。
關(guān)鍵詞:Scrapy框架;爬蟲;數(shù)據(jù)可視化
DOI: 10. 11907/rjdk.191814
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
中圖分類號:TP393
文獻標(biāo)識碼:A
文章編號:1672-7800(2020)004-0224-05
0 引言
隨著大數(shù)據(jù)時代的來臨,普通搜索已無法滿足人們對信息獲取的需求,網(wǎng)絡(luò)爬蟲應(yīng)運而生。網(wǎng)絡(luò)爬蟲又稱網(wǎng)絡(luò)蜘蛛,是一種能夠根據(jù)程序設(shè)計者所設(shè)計的規(guī)則自動抓取特定網(wǎng)頁信息的程序。按照實現(xiàn)原理可分為3類:第一類是通用網(wǎng)絡(luò)爬蟲,指搜索引擎爬蟲,類似于百度、谷歌等大型搜索引擎[1],其特點是根據(jù)一定的策略,用特定的計算機程序,將互聯(lián)網(wǎng)上的信息加以收集并對信息進行篩選和排列后展示給用戶,搜索引擎由搜索者、用戶界面、索引器和搜索器4部分組成[2];第二類是聚焦爬蟲,其可以針對特定網(wǎng)頁,也稱為網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機器人,還經(jīng)常被稱為網(wǎng)頁追逐者。它與搜索引擎的區(qū)別在于其針對性強并細化了搜索內(nèi)容[3];第三類是增量式網(wǎng)絡(luò)爬蟲,是指對已下載網(wǎng)頁采取增量式更新和只爬行新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁的爬蟲,它能夠在一定程度上保證所爬行的頁面是盡可能新的頁面[4]。此外,也涌現(xiàn)了很多成熟的爬蟲框架,如非常流行的Scrapy[5-10]。
但是,傳統(tǒng)爬蟲網(wǎng)絡(luò)獲取頁面較少,無法滿足爬取需求,代碼也比較復(fù)雜。本文通過修改url中的setoff屬性,改變starTtime的值,以貓眼網(wǎng)站為例,通過Scrapy搭建爬蟲項目,分析整個爬蟲原理。一是實現(xiàn)程序在遠程服務(wù)、手機端的部署;二是通過改變不同的數(shù)據(jù)接口,實現(xiàn)對貓眼網(wǎng)絡(luò)電影《復(fù)仇者聯(lián)盟4》更多評論信息抓取,并對獲取的數(shù)據(jù)進行可視化分析。
1 Scrapy框架介紹
Scrapy是由Python開發(fā)人員開發(fā)的一種高速、高級的Web捕獲框架,它被用來抓取網(wǎng)站內(nèi)容并從頁面中提取結(jié)構(gòu)化數(shù)據(jù)。與普通網(wǎng)絡(luò)爬蟲不同的是,基于Scrapy的爬蟲系統(tǒng)抓取的網(wǎng)頁信息需與用戶需求相關(guān),而無需對互聯(lián)網(wǎng)上的所有資源進行采集[11-13]。
1.1 框架組成
Scrapy架構(gòu)如圖1所示,其中包含了Engine、ItemPipeline、Downloader、Spider以及Scheduler等幾個組件模塊,圖中箭頭表示數(shù)據(jù)在整個系統(tǒng)中的處理流程[14-15]。
1.2 組件說明
Engine:引擎是觸發(fā)系統(tǒng)工作任務(wù)的框架核心,系統(tǒng)數(shù)據(jù)流處理都由它統(tǒng)一調(diào)度處理的。
調(diào)度器:用來接受引擎?zhèn)鬟_的請求,并將請求壓入隊列中,在引擎再次請求時返回??梢韵胂癯梢粋€URL的優(yōu)先隊列,它會決定下一個要抓取的網(wǎng)址是什么,并對網(wǎng)址進行查重,去除重復(fù)網(wǎng)址。
下載器:下載網(wǎng)頁中所需內(nèi)容,然后將該內(nèi)容返回給爬蟲。
爬蟲:從特定網(wǎng)頁也即實體中抓取所需信息,分析頁面信息,提取下一頁的鏈接進行遞歸爬取。
項目管道:負責(zé)處理爬蟲從網(wǎng)頁中提取的實體,主要功能是對實體進行持久化,驗證實體的有效性,清除不必要的信息。當(dāng)爬蟲對頁面進行解析時,會將其發(fā)送到項目管道中,并按幾個特定的順序?qū)?shù)據(jù)進行處理。管道的執(zhí)行過程具體包括清洗HTML數(shù)據(jù)、驗證解析到的數(shù)據(jù)、檢查是否為重復(fù)數(shù)據(jù),并將解析到的數(shù)據(jù)存儲到數(shù)據(jù)庫中。
爬蟲中間件:位于引擎和爬蟲之間的框架,負責(zé)處理爬蟲的響應(yīng)及輸出。
下載器中間件:位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應(yīng)[16-18]。
1.3 Spider工作流程
首先解析第一個URL,獲取它的請求,在其返回時檢索回調(diào)函數(shù);之后在回調(diào)函數(shù)中,對解析網(wǎng)頁進行響應(yīng),返回項目對象和請求對象的迭代,請求中還將包含一個回調(diào)信息,由Scrapy下載;然后對其進行回調(diào)處理,在回調(diào)函數(shù)中,對網(wǎng)站內(nèi)容進行解析,使用Xpath選擇器生成解析后的數(shù)據(jù)項;最后,從爬蟲返回的信息通常都進入到項目管道中。
1.4 Pandas庫
Pandas模塊是Python用于數(shù)據(jù)導(dǎo)人及整理的模塊,對數(shù)據(jù)挖掘前期數(shù)據(jù)處理十分有用。Pandas庫具有兩種數(shù)據(jù)類型:Series類型和Dataframe類型。本文主要采用Dataframe數(shù)據(jù)類型,Dataframe是一種帶“標(biāo)簽”的二維數(shù)組,基本操作與Series類型相似。
1.5 Pyecharts庫
Pvecharts是Pvthon中用來生成Echarts圖表的類庫,而Echarts是支持?jǐn)?shù)據(jù)可視化的一個JS庫,用Echarts生成的數(shù)據(jù)圖形效果非常好。Pyecharts與Python接口一起,方便在Pvthon中直接使用數(shù)據(jù)生成。使用Pvecharts可以生成單獨的網(wǎng)頁,也可以在Djangoflask中集成和使用。本文主要使用Pyecharts生成獨立的Web顯示圖表。
1.6 Json庫
Json是一種輕量級的數(shù)據(jù)交換格式,其結(jié)構(gòu)簡單、層次清晰,易于編寫和讀取,也可由機器輕松解析生成,達到提高網(wǎng)絡(luò)傳輸效率的目的。在數(shù)據(jù)交換方法中,它是頗具優(yōu)勢的數(shù)據(jù)交換格式之一。絕大多數(shù)網(wǎng)頁都具有Json格式的數(shù)據(jù)文件,Javascript是Json的主戰(zhàn)場,相比于XML而言,Json自然是更具有優(yōu)勢的數(shù)據(jù)交換格式。此外,JSON和XML還有一個很大區(qū)別,即有效的數(shù)據(jù)速率。JSON作為數(shù)據(jù)包格式傳輸時效率更高,因為JSON不需要像XML這樣嚴(yán)格的封閉標(biāo)簽,與總數(shù)據(jù)包相比,這極大提高了有效數(shù)據(jù)量,從而在數(shù)據(jù)流量相等的情況下降低了網(wǎng)絡(luò)傳輸壓力[19-20]。
Json庫中的Encode函數(shù)在Python中可以有效地轉(zhuǎn)換Python對象和Json對象。尤其在可視化數(shù)據(jù)時,將獲得的數(shù)據(jù)轉(zhuǎn)換成Json對象,可以使數(shù)據(jù)靈活地轉(zhuǎn)換為Pandas庫的數(shù)據(jù)操作對象。
2 Spider模型建立
本文以Scrapy為框架編寫網(wǎng)絡(luò)爬蟲程序,使程序可自動爬取貓眼網(wǎng)的指定信息。在抓取到指定的Json文件地址后,對該地址下的數(shù)據(jù)進行格式轉(zhuǎn)換及存儲操作,具體步驟如下:
(1)使用Pycharm在Terminal中搭建Scrapy框架,建立“maovan”工作項目。
(2)在item.py文件中創(chuàng)建需要爬取的字段屬性,其中有城市:“city”,評論:“content”,用戶id:“user_id”,昵稱:“nick name”,評分:“score”,評論時間:“time”,用戶等級:“user level”。
(3)在創(chuàng)建的爬蟲主文件comment.py中,將多個用戶代理以數(shù)組的形式定義。
(4)通過指定接口獲取用戶評論地址,并將該地址下的數(shù)據(jù)轉(zhuǎn)換為Json格式。
(5)通過循環(huán)判斷,將篩選出來的數(shù)據(jù)用yieldrequest方法傳送到管道中。
(6)在pipelines.py文件中,將數(shù)據(jù)創(chuàng)建dataframe格式并存儲到csv文件中。
(7)創(chuàng)建data_analysis.py,用Pyecharts庫及Pandas庫的方法對數(shù)據(jù)進行可視化處理。3頁面分析
分析頁 url:
m.maoyan.com/m ovie/248172/e omments?_v_=yes
在獲取跳轉(zhuǎn)頁面時選擇xpath對跳轉(zhuǎn)標(biāo)簽進行定位,獲取跳轉(zhuǎn)標(biāo)簽下的url。本文使用Chrome開發(fā)者工具,maoyan.com為該網(wǎng)站域名,目標(biāo)url中的“248712”為《復(fù)仇者聯(lián)盟4》在該網(wǎng)站目錄下“movle”目錄中的編號。但是貓眼網(wǎng)在PC端的設(shè)計中未展示所有評論內(nèi)容,而且PC瀏覽器接口在訪問該網(wǎng)頁時被限制,只能獲取到熱門評論,于是調(diào)試為手機端訪問模式如圖2所示,實際操作是模擬手機端的接口訪問貓眼網(wǎng)。
由于貓眼網(wǎng)未設(shè)置接口的反爬取機制,通過模擬手機客戶端( Galaxy S5)的訪問方式,能直接得到貓眼網(wǎng)電影評論信息的Json數(shù)據(jù),這更方便結(jié)果獲取。
4 url構(gòu)造策略
目標(biāo)域名:maoyan.com
目標(biāo)url:
http: //m .maoyan.com/m md b/comments/m ovie/2489 06.json?
_v_ =yes&offset=O&startTime=2019-04-29% 2004: 08:34
正常情況下,如果以offset(每次+15)的方法控制翻頁進行數(shù)據(jù)爬取,所獲得的數(shù)據(jù)最大值到990條就不能繼續(xù)獲取了。本文在嘗試多個不同的接口對評論頁面進行訪問之后,成功地找到了除setoff外還擁有starttime屬性的接口,通過在url中設(shè)定setoff為0,改變starTtime的值,即將每頁評論中最后一次評論時間作為新的startTime并構(gòu)造新的url壓入隊列進行重新訪問、爬取,這樣就可以獲取更多評論,具體構(gòu)造方式如圖3所示。
5“貓眼”爬蟲總體設(shè)計
5.1 定義item.py
本文使用命令行生成maoyan的Scrapy爬蟲項目,同時在該項目目錄下生成Scrapy框架的文件目錄,如圖4所示。
5.2 定義settings.py
在settings.py文件中,將ROBOTSTXT一OBEY屬性改為False,ROBOTSTXT-OBEY是一個機器人協(xié)議,當(dāng)其屬性為True時,它會限制爬蟲文件所能爬取的范圍。由于此次爬取的數(shù)據(jù)內(nèi)容較大,因此將其改為False,并將其定義于pipelinese.py中的規(guī)則激活即可。
5.3 comment.py
comments.py是爬蟲的主文件,爬蟲代碼在此完成。首先在CommentSpider類中定義爬蟲名為comment,用al-lowed_domains將除maoyan.com外的域名進行過濾處理,再將多個不同的用戶代理以字典的形式儲存,定義一個變量隨機獲取該字典中的不同用戶代理。定義一個變量cur-rent_time獲取系統(tǒng)當(dāng)前時間,再對目標(biāo)url中的start_Time值進行替換,可獲得更多評論數(shù)。
完成上述操作之后,對parse函數(shù)進行定義,首先定義item繼承items.py文件中的Maoyanltem(),其次定義data變量用response.body方法保存指定頁面下的數(shù)據(jù),再定義json_data變量保存json格式化過的data值,最后對json_data中的數(shù)據(jù)進行循環(huán)判斷,符合條件的數(shù)據(jù)賦值給item進入管道。
爬蟲數(shù)據(jù)在csv中存儲部分如表1所示,其中表頭部分包括城市:“city”,評論:“content”,用戶id:“user_id”,昵稱:“nick—name”,評分:“score”,評論時間:“time”,用戶等級:“user_level”。由于表格內(nèi)容較多,具體評論內(nèi)容取其前4個字,截取2019年4月29日時間段。
5.4 替換start_Time
為了爬取所有評論信息,在不改變setoff的條件下,將該頁面最后一條評論的評論時間作為新的開始時間,即將startTime改為:startTime=-+ current_t.replace(‘,%20)的形式,對頁面重新請求,可獲取更多評論數(shù)。
5.5 pipelines.py
將pipelines.py管道中的數(shù)據(jù)與各對應(yīng)數(shù)據(jù)名做一個字典類型存儲在dic t_info,字典每個元素的第1位字符串為生成的csv文件表頭。表頭內(nèi)容有城市:“city”,評論:“content”,用戶id:“user_id”,用戶昵稱:“nike_name”,評分:“score”,評論時間:“time”,用戶等級:“user_level”,再為其建立dataframe的表格形式,最后輸出為csv文件。具體代碼為:
import scrapy
class Maoyanltem( scrapy.ltem):
# define the fields for your item here like:
# name= scrapy.Field()
city= scrapy.Field()#城市
content= scrapy.Field()#評論
user_id= scrapy.Field()#用戶id
nick_name= scrapy.Field()#昵稱
score= scrapy.Field()#評分
time= scrapy.Field()#評論時間
user_level= scrapy.Field()#用戶等級
pipelines.py:
import pandas as pd
class MaoyanPipeline( object):
def process_item( self, item, spider):
dict_info={'city': item[ 'city'],‘contem': item[‘content],'user_id:item[‘user_id],
‘nick_name: item[‘nick_name9],
‘score : item[ 'score' ] , 'time' : item[‘time],'user_level: item[‘user_level']}
try:
data= pd.DataFrame( dict_info, index=[O])#為data創(chuàng)建一個表格形式,注意加index=[0]
data.to_csv ( ‘E:/pytest/maoyan/maoyan/info.csv ,header=False. index=True. mode=‘a(chǎn).
encoding=‘utf_8_sig)#模式:追加,encod-ing=‘utf-8-sig
except Exception as error:
print(‘寫入文件出錯一一一一>>>+str( error))
else:
print(dict_info[‘content]+‘一一一一一一一一一一>>>已經(jīng)寫入文件)
5.6 data_analysis.py
在data_analysis.py中對數(shù)據(jù)進行可視化操作,用Py-echarts庫的Render方法生成html文件并保存在制定的目錄之下。首先制作觀眾地域排行榜單,用Pandas庫的Counter.most.common方法獲取city列表中用戶量前20的城市賦值給data_top20,然后用bar對將要生成的圖片格式進行定義。
由圖5圖可以看出,評論的用戶觀眾深圳最多,達703人,第二是廣州660人,第三是北京628人。
制作觀眾評分排行榜單,同樣使用Pandas庫的數(shù)據(jù)操作方法對Dataframe類型的數(shù)據(jù)進行操作,再用Pvecharts庫的語法調(diào)用被處理過的數(shù)據(jù)生成最終圖表并由html格式文件展示。如圖6所示,評價為5的用戶觀眾為10 353人,遠超于其他等級用戶,說明《復(fù)仇者聯(lián)盟4》的觀眾絕大部分都認為它是一部值得觀看的好電影。
詞云可以顯示觀眾評論中出現(xiàn)評論最高的詞匯,如圖7所示,評論中出現(xiàn)最多的詞有“好看”“劇情”“鋼鐵”“完美”“精彩”“情懷”“特效”等。由此可以看出,大部分觀眾對《復(fù)仇者聯(lián)盟4》表達了認同和贊美,說明《復(fù)仇者聯(lián)盟4》是一部值得觀看的優(yōu)質(zhì)電影。
6 結(jié)語
本文基于Pvthon的開源Scrapy框架實現(xiàn)貓眼《復(fù)仇者聯(lián)盟》主題爬蟲編寫,在編寫Spider主文件時對URL構(gòu)造設(shè)計進行改造,找到最優(yōu)辦法解決爬取數(shù)據(jù)量太少的問題。本文共提取出了有效信息16 664條,比常規(guī)爬取數(shù)據(jù)多出16倍,達到了預(yù)期爬取數(shù)量和質(zhì)量。此外,通過編寫靈活爬蟲,簡單有效地垂直爬取主題網(wǎng)站,剔除有用信息提取,在存儲和查詢方面都大大提速,并且精度更高,信息使用率增高,減少了能量消耗,并通過可視化分析使得爬取結(jié)果更加直觀;最后利用Scrapy框架,在抓取大量數(shù)據(jù)方面有顯著優(yōu)勢,比普通爬蟲動則上萬的代碼量減少很多,提高了信息利用率。
參考文獻:
[1]王巖.搜索引擎中網(wǎng)絡(luò)爬蟲技術(shù)的發(fā)展[J].電信快報,2008( 10):20-22.
[2] 李小正,成功,趙全軍.分布式爬蟲系統(tǒng)的設(shè)計與實現(xiàn)[J].中國科技信息,2012( 15):116-117.
[3] 管華.對當(dāng)今Pvthon快速發(fā)展的研究與展望[J].信息系統(tǒng)工程,2015( 12):114-116.
[4] 孟慶浩,王晶,沈奇威.基于Heritri的增量式爬蟲設(shè)計與實現(xiàn)[J].電信技術(shù),2014(9):97-102.
[5] 趙本本,殷旭東,王偉.基于Scrapy的GitHub數(shù)據(jù)爬蟲[J].電子技術(shù)與軟件工程,2016(6):199-202.
[6] 華云彬,匡芳君.基于Scrapy框架的分布式網(wǎng)絡(luò)爬蟲的研究與實現(xiàn)[J].智能計算機與應(yīng)用,2018,8(5):46-50.
[7] 丁忠祥,楊彥紅,杜彥明.基于Scrapy框架影視信息爬取的設(shè)計與實現(xiàn)[J].北京印刷學(xué)院學(xué)報,2018,26(9):92-97.
[8] 王芳,張睿,龔海瑞.基于Scrapy框架的分布式爬取設(shè)計與實現(xiàn)[J].信息技術(shù),2019 (3):96-101.
[9]
KAUSAR M A, DHAJA V S,SINGH S K.Web crawler:a revieW [J].International Journal of Computer Application, 2013, 63(2):31-36.
[10] 劉宇,鄭成煥.基于Scrapy的深層網(wǎng)絡(luò)爬蟲研究[J].軟件,2017,38(7):111-114.
[11] 王磊,劉曉丹.基于Scrapy的網(wǎng)絡(luò)爬蟲系統(tǒng)框架設(shè)計與實現(xiàn)[J].微型電腦應(yīng)用,2018(7):48-50.
[12] 呂俊宏,周江峰.深入解析Cookie技術(shù)[J].數(shù)字通信世界,2015(6):332-333.
[13]姜彬彪,黃凱琳,盧昱江,等.基于Python的專業(yè)網(wǎng)絡(luò)爬蟲的設(shè)計與實現(xiàn)[J].企業(yè)科技與發(fā)展,2016(8):17-19.
[14] 安子建.基于Scrapy框架的網(wǎng)絡(luò)爬蟲實現(xiàn)與數(shù)據(jù)抓取分析[D].長春:吉林大學(xué),2017.
[15] 張笑天.分布式爬蟲應(yīng)用中布隆過濾器的研究[D].沈陽:沈陽工業(yè)大學(xué),2017.
[16]
CATTELL R Scalahle SQL and NoSQL data store [J]. ACM SIGMODRecord, 2011(2):12-27.
[17] 劉學(xué).分布式多媒體網(wǎng)絡(luò)爬行系統(tǒng)的設(shè)計與研究[D].武漢:華中科技大學(xué),2012.
[18]李代祎,謝麗艷,錢慎一,等.基于Scrapy分布式爬蟲系統(tǒng)的設(shè)計與實現(xiàn)[J].湖北民族學(xué)院學(xué)報(自然科學(xué)版),2017,35(3): 317-322.
[19] 陶興海.基于Scrapy框架的網(wǎng)絡(luò)爬蟲模擬登陸網(wǎng)站實現(xiàn)[J].計算機與軟件,2017(6):51-51.
[20] 成功,李小正,趙全軍.一種網(wǎng)絡(luò)爬蟲系統(tǒng)中URL去重方法的研究[J].中國新技術(shù)新產(chǎn)品,2014( 12):23.
(責(zé)任編輯:孫娟)
收稿日期:2019-06-04
基金項目:教育部產(chǎn)學(xué)協(xié)同育人項目(JCH2019003,JCH2019023);福建省高校產(chǎn)學(xué)合作項目(2018H6018);福建省教育教學(xué)教改項目( FBJC20170154);福建省產(chǎn)學(xué)研項目(2018H6018);漳州市自然科學(xué)基金項目(222018J26)
作者簡介:王海玲(1982-),女,碩士,廈門大學(xué)嘉庚學(xué)院信息科學(xué)與技術(shù)學(xué)院副教授,研究方向為數(shù)據(jù)挖掘與數(shù)據(jù)分析;周志彬(1996-),男,廈門大學(xué)嘉庚學(xué)院信息科學(xué)與技術(shù)學(xué)院學(xué)生,研究方向為數(shù)據(jù)挖掘。