高雨菲 毛紅霞
摘? 要:豆瓣是一個(gè)通過提供書籍影視相關(guān)內(nèi)容發(fā)展起來的網(wǎng)站,能夠提供電影的各類信息。豆瓣用戶的評(píng)論有時(shí)能引領(lǐng)一代新的風(fēng)尚潮流。文章使用Python語言結(jié)合有關(guān)爬蟲的知識(shí)設(shè)計(jì)了有關(guān)豆瓣影視短評(píng)的爬取系統(tǒng),采用了URL管理器、網(wǎng)頁(yè)結(jié)構(gòu)分析、數(shù)據(jù)采集、數(shù)據(jù)清洗、數(shù)據(jù)分析、數(shù)據(jù)可視化等模塊,將指定的電影影評(píng)內(nèi)容保存,精準(zhǔn)的獲取不同電影的被喜愛程度以及電影上映后帶來的反響。
關(guān)鍵詞:Python;數(shù)據(jù)采集;數(shù)據(jù)清洗;數(shù)據(jù)可視化
中圖分類號(hào):TP391.1? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2020)24-0010-04
Data Collection and Analysis of Douban Film and Television Short Commentary Based on Python
GAO Yufei,MAO Hongxia
(School of Computer and Software,Jincheng College of Sichuan University,Chengdu? 611731,China)
Abstract:Douban is website that is gradually developed through providing books,film and television related content,it can provide different kinds of information about film. Sometimes,Douban userscomments can lead a generation of new fashion trend. In this paper,using Python language and combining with the knowledge on crawlers to design a crawling system about Douban film and television short commentary,which adopts the following modules such as URL manager,webpage structure analysis,data collection,data cleaning,data analysis and data visualization etc to save the specified film review content,so as to accurately obtain the popularity extent of the different films and response produced after the filmsshowing.
Keywords:Python;data collection;data cleaning;data visualization
0? 引? 言
隨著互聯(lián)網(wǎng)時(shí)代的到來,網(wǎng)絡(luò)上的數(shù)據(jù)量持續(xù)高速增長(zhǎng),已經(jīng)呈現(xiàn)出數(shù)以千萬計(jì)的數(shù)據(jù)大爆發(fā)。面對(duì)著這樣龐大的數(shù)據(jù)僅僅使用人工來篩選有價(jià)值的數(shù)據(jù)是不現(xiàn)實(shí)的。通過Python編寫程序來自動(dòng)獲取信息的網(wǎng)絡(luò)爬蟲應(yīng)運(yùn)而生。在當(dāng)下,娛樂行業(yè)蓬勃發(fā)展,電影作為其中的主力之一,有著龐大的受眾,大量的豆瓣用戶在豆瓣網(wǎng)站上留下了他們對(duì)于不同電影的評(píng)論。本文采用Python作為編程語言,爬取當(dāng)下熱門電影的影評(píng),并對(duì)于爬取的數(shù)據(jù)內(nèi)容進(jìn)行了一系列的清洗與整理,將有價(jià)值的數(shù)據(jù)進(jìn)行了分析并通過可視化技術(shù)展現(xiàn)出來。
1? 爬蟲原理
網(wǎng)絡(luò)爬蟲是通過獲取的不同的URL作為核心的支撐,來尋找和抓取在URL之下的各種文章,鏈接和圖片等內(nèi)容。在給定的URL中,網(wǎng)絡(luò)爬蟲會(huì)不斷地從中抽取URL,然后對(duì)當(dāng)下URL的內(nèi)容進(jìn)行篩選和獲取,當(dāng)一個(gè)URL從頭到尾都查找完了之后,網(wǎng)絡(luò)爬蟲會(huì)自動(dòng)地進(jìn)入到下一個(gè)URL中,重復(fù)之前的步驟,直到所有的URL都被查找了一次。轉(zhuǎn)到技術(shù)層面來說,是通過程序模擬瀏覽器請(qǐng)求站點(diǎn)的行為,把站點(diǎn)返回的數(shù)據(jù)(HTML代碼/JSON數(shù)據(jù)/二進(jìn)制數(shù)據(jù))存放在本地,等待后期使用。根據(jù)不同需要有目的地進(jìn)行爬取,要增加目標(biāo)的定義和過濾機(jī)制。本文采用簡(jiǎn)單的框架結(jié)構(gòu)來編寫爬蟲程序,分別有以下四個(gè)模塊:URL管理器、網(wǎng)頁(yè)下載器、網(wǎng)頁(yè)解析器、網(wǎng)頁(yè)輸出器,這四個(gè)模塊共同完成抓取網(wǎng)頁(yè)的整個(gè)過程[1]。
2? 影評(píng)爬取數(shù)據(jù)系統(tǒng)設(shè)計(jì)
2.1? 網(wǎng)頁(yè)URL分析
首先通過對(duì)于本文要獲取的豆瓣的電影的網(wǎng)頁(yè)影評(píng)界面進(jìn)行分析,觀察需要的URL地址。可以發(fā)現(xiàn),豆瓣的每一部電影在subject/之后的數(shù)字則對(duì)應(yīng)了每一部固定的電影。如圖1所示,在start=與limit=20之間的數(shù)值都是以每頁(yè)20的速度遞增的,可以通過改變程序中有關(guān)于抓取網(wǎng)頁(yè)URL時(shí)候的數(shù)值的改變來進(jìn)行程序的簡(jiǎn)單模擬翻頁(yè)。解析網(wǎng)頁(yè)URL的代碼為:
for i in range(n):
url='https://movie.douban.com/subject/26754233/comments?start={&limit=20&status=P&sort=new_score'url = url.format(i*20)
2.2? 網(wǎng)頁(yè)內(nèi)容解析
對(duì)于頁(yè)面解析不同的使用者在不同的網(wǎng)站上使用的解析方法都不一樣,主要的解析方式有正則表達(dá)式,其次是解析庫(kù),常用的有兩個(gè)解析庫(kù)有l(wèi)xml和BeautifulSoup。通過確定每個(gè)數(shù)據(jù)對(duì)應(yīng)的元素及Class名稱后,使用find,find_all,select等方法進(jìn)行標(biāo)簽的定位,進(jìn)行數(shù)據(jù)提取[2]。通過Chrome瀏覽器的開發(fā)者工具,可以看到如圖2所示的源代碼。通過源代碼可以找到影評(píng)中的評(píng)論者信息,評(píng)論者主頁(yè)網(wǎng)址,影評(píng)評(píng)論的內(nèi)容,具體評(píng)論的時(shí)間,以及評(píng)論者對(duì)于這部電影的喜好程度等級(jí)。
同樣的方式打開用戶的主頁(yè),如圖3所示,可以找到在主頁(yè)的右上方有一份關(guān)于用戶的個(gè)人信息的簡(jiǎn)單補(bǔ)充。
2.3? 反爬蟲措施的應(yīng)對(duì)
針對(duì)爬蟲,很多網(wǎng)站都有了反爬蟲手段,而建立網(wǎng)絡(luò)爬蟲的第一原則是:所有信息都是偽造的[3]。本文主要采用了四種方式來應(yīng)對(duì)反爬蟲措施:
(1)使用Cookies。豆瓣網(wǎng)站上,每一個(gè)注冊(cè)了豆瓣賬號(hào)的用戶都有一個(gè)獨(dú)一無二的Cookies。Cookies是辨別用戶身份的重要途徑??梢酝ㄟ^Session跟蹤而儲(chǔ)存用戶在網(wǎng)頁(yè)登錄時(shí)候的Cookies來進(jìn)行模擬用戶登錄訪問網(wǎng)頁(yè),來獲取只有登錄之后才能被查找到的內(nèi)容。
(2)使用用戶的代理信息。通過F12,找到Headers,主要關(guān)注用戶代理User-Agent字段。User-Agent代表用戶是使用什么設(shè)備來訪問網(wǎng)站的。不同瀏覽器的User-Agent值是不同的。通過在Headers中添加User-Agent就可以在爬蟲程序中,將其偽裝成不同的設(shè)備訪問瀏覽器信息。
(3)設(shè)置延時(shí)訪問。在使用程序訪問網(wǎng)頁(yè)的時(shí)候往往在一秒鐘內(nèi)可以訪問幾百上千次,而在現(xiàn)實(shí)生活中,用戶是無法在一秒鐘內(nèi)達(dá)到這樣一個(gè)訪問速度的。這樣爬蟲的程序就很容易被網(wǎng)站監(jiān)測(cè)出來。因此,可以使用sleep()來降低爬蟲在一段時(shí)間之內(nèi)的爬取速度,由此來模擬用戶行為。
(4)建立用戶代理池來達(dá)到隨機(jī)爬取的目的。在爬取過程中,一直用同樣一個(gè)地址爬取是不可取的。如果每一次訪問都是不同的用戶,對(duì)方就很難進(jìn)行反爬,那么用戶代理池就是一種很好的反爬攻克的手段。首先需要收集大量的用戶代理User-Agent,對(duì)于收集到的用戶代理信息建立函數(shù)UA(),用于切換用戶代理User-Agent。最后利用上面所提到的用戶代理池進(jìn)行爬取,使用Python中的隨機(jī)函數(shù)random()來隨機(jī)獲取用戶代理信息,來使用不同的用戶來訪問網(wǎng)頁(yè)信息。
2.4? 網(wǎng)頁(yè)內(nèi)容的獲取與保存
首先要獲取有需求的網(wǎng)頁(yè)內(nèi)容信息??梢允褂枚嗑€程的網(wǎng)絡(luò)爬蟲來提高獲取內(nèi)容的速度。對(duì)于指定需要獲取內(nèi)容的獲取代碼為:
def query(get_url):
#函數(shù)功能獲取內(nèi)容并存入對(duì)應(yīng)的文件
rqg = requests.get(get_url, headers=headers)
rqg.encoding = chardet.detect(rqg.content)['encoding'l
html=rqg.content.decode(utf-8", "ignore")
html = etree.HTML(html, parser=etree.HTMLParser (encoding='utf-8'))search = html.xpath('//*[@id="profile"]/div/div[2]/div[1]/div/a/text()")
path='C:/Users/hby/PycharmProjects/pythonProject1/地址.txt'
f = open(path, mode=w", encoding='utf-8)
f.writelines(search)
f.close()
將從網(wǎng)頁(yè)之中爬取下來的數(shù)據(jù)轉(zhuǎn)化為本地的csv文件或者是txt文本??梢缘玫饺鐖D4所示的幾個(gè)類別信息,分別為評(píng)論者、時(shí)間、評(píng)分、內(nèi)容和主頁(yè)地址。通過對(duì)主頁(yè)內(nèi)容的抓取可以獲得大量的參與評(píng)論的用戶的常居住的文本信息。保存為本地文件的代碼為:
#to_csv導(dǎo)出為.csv文件; to_excel導(dǎo)出為.xls或.xlsx文件
df.to_excel(r'C:/Users/hby/PycharmProjects/pythonProject1/0.xls'.format(name),index=False)
print('導(dǎo)出完成?。?/p>
def write_txt(file_name,wirte_name):
df = pd.read_excel(file_name, header=None)
#使用pandas模塊讀取數(shù)據(jù)
print('開始寫入txt文件...")
df1=df[3]
df1.to_csv(wirte_name, header=None,sep=",", index=False)
#寫入,逗號(hào)分隔
print('文件寫入成功!'")
3? 數(shù)據(jù)分析系統(tǒng)設(shè)計(jì)
3.1? 數(shù)據(jù)清洗
檢測(cè)數(shù)據(jù)中存在冗余、錯(cuò)誤、不一致等噪聲數(shù)據(jù),利用各種清洗技術(shù),形成“干凈”的一致性數(shù)據(jù)集合,而數(shù)據(jù)清洗技術(shù)包括清除重復(fù)數(shù)據(jù)、填充缺失數(shù)據(jù)、消除噪聲數(shù)據(jù)等[4]。常用數(shù)據(jù)清洗函數(shù):排序,搜索np.sort函數(shù);從小到大進(jìn)行排序np.argsort函數(shù);返回的是數(shù)據(jù)中從小到大的索引值np.where;可以自定義返回滿足條件的情況np.extract;返回滿足條件的元素值。
Pandas常用數(shù)據(jù)結(jié)構(gòu)Series和方法通過pandas.Series來創(chuàng)建Series數(shù)據(jù)結(jié)構(gòu)。pandas.Series(data,index,dtype,name)。上述參數(shù)中,data可以為列表,array或者dict。上述參數(shù)中,index表示索引,必須與數(shù)據(jù)同長(zhǎng)度,name代表對(duì)象的名稱Pandas常用數(shù)據(jù)結(jié)構(gòu)dataframe和方法通過pandas.DataFrame來創(chuàng)建DataFrame數(shù)據(jù)結(jié)構(gòu)。pandas.DataFrame (data,index,dtype,columns)。上述參數(shù)中,data可以為列表,array或者dict。上述參數(shù)中,index表示行索引,columns代表列名或者列標(biāo)簽。對(duì)于一些空值的位置可以適當(dāng)?shù)闹苯觿h除當(dāng)前位置。部分具體清洗數(shù)據(jù)代碼為:
def cleanout(path_file1):
result =[]
with open(path_file1, 'r', encoding='utf-8') as f:for line in f:
result.append(line.strip(r'\n').split('\n')[O])
df = pd.DataFrame(result)
drop=df.replace('[]',np.nan)
data=drop.dropna(how='all')list= data.values.tolist()
counts = dict(zip(*np.unique(list, return_counts=True)))
3.2? 數(shù)據(jù)可視化
數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)領(lǐng)域中的一種技術(shù),它使復(fù)雜的數(shù)據(jù)看起來簡(jiǎn)單易懂。詞云圖,也稱為文字云,是用圖像的方式對(duì)文本中頻繁出現(xiàn)的詞語進(jìn)行展現(xiàn),形成“關(guān)鍵詞渲染”或者“關(guān)鍵詞云層”的效果[5]。如圖5所示,通過詞云的刪減可以直觀地看到電影的主要文本內(nèi)容和一些突出的要素。可以借助Python的第三方庫(kù),如jieba庫(kù)來獲取有關(guān)于影評(píng)內(nèi)容的中文分詞,對(duì)于分詞后的內(nèi)容有著大量的無實(shí)際意義的詞語。也可導(dǎo)入自行增加刪減的stopwords來進(jìn)行無實(shí)際意義的詞語的刪減,達(dá)到想要的實(shí)際效果。某一特定文件內(nèi)的高詞語頻率,以及該詞語在整個(gè)文件集合中的低文件頻率,可以產(chǎn)生出高權(quán)重的TF-IDF[6]。
通過對(duì)于用戶的常居住地的處理和清洗之后,為了能夠更好、更直觀的呈現(xiàn)不同地區(qū)的差異,借助Python中的Basemap庫(kù),可以獲取到中國(guó)各省份的區(qū)分圖,如圖6所示,能夠發(fā)現(xiàn)不同地區(qū)的人對(duì)電影的討論熱度的差異。
4? 結(jié)? 論
通過Chrome的開發(fā)者查看源代碼我們可以直觀的看到不同的內(nèi)容在網(wǎng)頁(yè)上的位置,而利用Python編寫的程序可以幫助我們解析URL網(wǎng)頁(yè)。在網(wǎng)頁(yè)上獲取到所需要的內(nèi)容,保存到本地。針對(duì)爬取到的數(shù)據(jù)存在著格式不規(guī)范,內(nèi)容有空缺,數(shù)據(jù)出錯(cuò)等情況,需要在使用之前進(jìn)行數(shù)據(jù)的清洗與整理。對(duì)數(shù)據(jù)運(yùn)用不同的分析方法,最后借助圖表的方式來清晰直觀的展現(xiàn)出所要呈現(xiàn)的結(jié)果,由結(jié)果可以看出觀眾對(duì)于本文電影的感受是受到了非常大的歷史震撼的,而北京和上海的用戶對(duì)于本文電影的內(nèi)容在豆瓣網(wǎng)上的評(píng)論較多。
參考文獻(xiàn):
[1] 孫冰.基于Python的多線程網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn) [J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2018(4):38-39.
[2] 成文瑩,李秀敏.基于Python的電影數(shù)據(jù)爬取與數(shù)據(jù)可視化分析研究 [J].電腦知識(shí)與技術(shù),2019,15(31):8-10+12.
[3] XIE D X,XIA W F. Design and implementation of the topic-focused crawler based on scrappy [J].Advanced Materials Research,2014(850-851):487-490.
[4] 孔欽,葉長(zhǎng)青,孫赟.大數(shù)據(jù)下數(shù)據(jù)預(yù)處理方法研究 [J].計(jì)算機(jī)技術(shù)與發(fā)展,2018,28(5):1-4.
[5] 祝永志,荊靜.基于Python語言的中文分詞技術(shù)的研究 [J].通信技術(shù),2019,52(7):1612-1619.
[6] 涂小琴.基于Python爬蟲的電影評(píng)論情感傾向性分析 [J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2017(35):52-55.
作者簡(jiǎn)介:高雨菲(1999.07—),女,漢族,四川內(nèi)江人,本科在讀,研究方向:數(shù)據(jù)科學(xué)與大數(shù)據(jù)技術(shù)。