李鑫欣 關(guān)菁華
摘要:21世紀(jì)是大數(shù)據(jù)時(shí)代。隨著互聯(lián)網(wǎng)的發(fā)展與普及,人們?cè)诨ヂ?lián)網(wǎng)上會(huì)留下大量的“個(gè)人信息足跡”。網(wǎng)絡(luò)數(shù)據(jù)量呈指數(shù)級(jí)增長(zhǎng),與此同時(shí)人們獲取想要的信息的難度也大幅度提高。搜索引擎的出現(xiàn)和發(fā)展提高了用戶檢索信息的效率。網(wǎng)絡(luò)爬蟲是搜索引擎相關(guān)技術(shù)的重要組成部分,爬蟲技術(shù)的發(fā)展助推信息資源獲取更加高效便捷?;赑ython技術(shù)對(duì)目標(biāo)網(wǎng)站——豆瓣網(wǎng)用戶讀書喜好信息(包括用戶想讀、在讀、讀過(guò)、評(píng)論等)進(jìn)行采集與存儲(chǔ),為后期的個(gè)性化推薦方法研究提供數(shù)據(jù)支持。在數(shù)據(jù)采集過(guò)程中涉及URL去重、模擬登錄、翻頁(yè)等技術(shù)處理。
關(guān)鍵詞:Python;網(wǎng)絡(luò)爬蟲;數(shù)據(jù)采集;模擬登錄;URL去重
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)08-0004-03
Gathering Douban Users Reading Preference Information Based on Python Technology
LI Xin-xin, GUAN Jing-hua
(Dalian University of Foreign Languages, Dalian 116044, China)
Abstract: The 21st century is a big data era. With the development and popularization of the Internet, people will leave a large number of "personal information footprints" on the Internet. The amount of network data is increasing exponentially; meanwhile, it has become more difficult to obtain the desired information, but the emergence and development of search engines has improved the efficiency of information retrieval. Web crawler technology, an important component of related search engine technology, is of great significance to research. Based on Python technology, this paper aims to collect and store Douban users reading preference information (including books users want to read, is reading, have read, and have commented on, etc.), and provide data support for the later research of personalized recommendation methods. URL deduplication, analog login, page turning and other technical processing are involved in the process of data acquisition.
Key words: Python; web crawler; data acquisition; simulation login; URL deduplication
1 背景
21世紀(jì)是大數(shù)據(jù)時(shí)代,同時(shí)也是人工智能浪潮興起的時(shí)代。由于移動(dòng)終端、互聯(lián)網(wǎng)以及無(wú)處不在的傳感器和微處理器的存在,人們無(wú)時(shí)無(wú)刻不留下“數(shù)據(jù)足跡”。[1]隨著互聯(lián)網(wǎng)相關(guān)技術(shù)的不斷發(fā)展,互聯(lián)網(wǎng)用戶數(shù)量激增,互聯(lián)網(wǎng)產(chǎn)品種類多、應(yīng)用范圍廣,幾乎覆蓋了人們生產(chǎn)生活中的每一個(gè)重要部分?;ヂ?lián)網(wǎng)上含有超過(guò)16億的網(wǎng)站,[2]而這些被索引的網(wǎng)站包含至少217億的頁(yè)面。[3]信息產(chǎn)業(yè)日益發(fā)達(dá),使得人們意識(shí)到對(duì)于海量數(shù)據(jù)的挖掘與采集具有重要意義。人們?cè)谏a(chǎn)生活中會(huì)產(chǎn)生大量的數(shù)據(jù),將這些數(shù)據(jù)加以利用又可以更好地服務(wù)于人們的生產(chǎn)生活。作為中國(guó)最早的web2.0網(wǎng)站之一,豆瓣網(wǎng)以其人性化操作,個(gè)性化網(wǎng)站設(shè)計(jì)和特有的文化特色為亮點(diǎn),充分利用web2.0的人性化特色,獲得了很多互聯(lián)網(wǎng)用戶的支持與青睞。[4]豆瓣網(wǎng)從2005年3月6日正式上線了發(fā)展至今,為用戶提供了多方面的信息服務(wù),包括讀書、電影、音樂(lè)、小組、同城、FM、時(shí)間、豆品等,深受互聯(lián)網(wǎng)用戶的喜愛。早在2012年豆瓣的月度覆蓋獨(dú)立用戶數(shù)已超過(guò)1億,日均PV(page view)為1.6億。豆瓣網(wǎng)站的用戶量巨大,因此對(duì)于該網(wǎng)站的用戶行為信息的采集具有研究意義。本項(xiàng)目以豆瓣讀書網(wǎng)站作為書籍采集目標(biāo)平臺(tái),對(duì)網(wǎng)站用戶的讀書喜好相關(guān)數(shù)據(jù)進(jìn)行采集,其中包括用戶想讀書籍、在讀書籍、讀過(guò)書籍以及書籍短評(píng)詳細(xì)信息。程序以豆瓣網(wǎng)站任意一個(gè)用戶為切入點(diǎn),采用廣度優(yōu)先的爬取策略,實(shí)現(xiàn)數(shù)據(jù)采集目標(biāo)。
2 網(wǎng)絡(luò)爬蟲概述
2.1 網(wǎng)絡(luò)爬蟲原理
網(wǎng)絡(luò)爬蟲是一種自動(dòng)抓取網(wǎng)頁(yè)并提取網(wǎng)頁(yè)內(nèi)容的程序,是搜索引擎的信息獲取渠道。[5]我們可以把互聯(lián)網(wǎng)比作一張大網(wǎng),而網(wǎng)絡(luò)爬蟲就是在網(wǎng)上爬行的蜘蛛。把網(wǎng)的節(jié)點(diǎn)比作一個(gè)個(gè)網(wǎng)頁(yè),爬蟲爬到這就相當(dāng)于訪問(wèn)了該頁(yè)面,獲取了其信息??梢园压?jié)點(diǎn)之間的連線比做網(wǎng)頁(yè)與網(wǎng)頁(yè)之間的連接關(guān)系,這樣蜘蛛通過(guò)一個(gè)節(jié)點(diǎn)后,可以順著節(jié)點(diǎn)連線繼續(xù)爬行到達(dá)下一個(gè)節(jié)點(diǎn),即通過(guò)一個(gè)網(wǎng)頁(yè)繼續(xù)獲取后續(xù)的網(wǎng)頁(yè),這樣整個(gè)網(wǎng)的節(jié)點(diǎn)便可以被蜘蛛全部爬行到,網(wǎng)站的數(shù)據(jù)就會(huì)被抓取下來(lái)了。[6]
2.2 網(wǎng)絡(luò)爬蟲現(xiàn)狀分析
網(wǎng)絡(luò)爬蟲技術(shù)發(fā)展至今,研究人員已經(jīng)為我們提供了許多開源庫(kù)與框架供我們學(xué)習(xí)和使用。近年來(lái),網(wǎng)絡(luò)爬蟲技術(shù)發(fā)展迅速,研究人員在原有技術(shù)的基礎(chǔ)上不斷地對(duì)程序進(jìn)行優(yōu)化與發(fā)展。目前知識(shí)版權(quán)的概念正在深入人心,網(wǎng)站網(wǎng)頁(yè)作為內(nèi)容的載體,其所保存的信息也屬于知識(shí)產(chǎn)權(quán)的范疇,理應(yīng)受到版權(quán)協(xié)議的保護(hù)。所以有相當(dāng)數(shù)量的網(wǎng)頁(yè)并不希望其出產(chǎn)的內(nèi)容被網(wǎng)絡(luò)爬蟲輕松地探測(cè)到并下載。[7]
因此,許多網(wǎng)站對(duì)于網(wǎng)絡(luò)爬蟲行為采取一定的限制措施,阻攔IP地址單位時(shí)間內(nèi)對(duì)于網(wǎng)站服務(wù)器的訪問(wèn)次數(shù)。如果爬蟲程序使用不當(dāng),有可能會(huì)承擔(dān)一定的法律風(fēng)險(xiǎn)。
3 爬蟲程序設(shè)計(jì)
本次項(xiàng)目的研究對(duì)象為豆瓣網(wǎng)站。從網(wǎng)站上任意一個(gè)豆瓣用戶入手,對(duì)此用戶的一度關(guān)注用戶以及二度關(guān)注用戶的讀書喜好信息進(jìn)行采集,包括想讀、在讀、讀過(guò)、書評(píng)涉及的數(shù)據(jù)詳細(xì)信息。
研究思路:
1)在豆瓣讀書網(wǎng)站上隨機(jī)找一位用戶,要求他的個(gè)人主頁(yè)中有一定的關(guān)注人和讀書喜好信息。找到符合要求的人作為我們的目標(biāo)用戶,將目標(biāo)用戶的URL(Uniform Resource Locator )保存下來(lái)。
2)爬取策略選擇。常見的網(wǎng)頁(yè)抓取策略采用廣度優(yōu)先算法和深度優(yōu)先算法。簡(jiǎn)單來(lái)說(shuō),廣度優(yōu)先算法是從開始節(jié)點(diǎn)出發(fā),盡可能廣地搜索與之距離較近的其他節(jié)點(diǎn);而深度優(yōu)先算法則側(cè)重于盡可能深地搜索與之距離較遠(yuǎn)的節(jié)點(diǎn)。針對(duì)自身程序特點(diǎn)以及對(duì)目標(biāo)數(shù)據(jù)的需求分析,選擇合適的優(yōu)先算法會(huì)提高程序運(yùn)行效率。本次程序設(shè)計(jì),在考慮多用戶之間的相關(guān)性問(wèn)題,采取廣度優(yōu)先算法進(jìn)行程序設(shè)計(jì)。在盡可能多地采集用戶一度關(guān)注用戶的主頁(yè)鏈接后,再對(duì)用戶二度關(guān)注用戶信息進(jìn)行采集。
3)根據(jù)目標(biāo)用戶的URL,使用基于Python語(yǔ)言的網(wǎng)絡(luò)爬蟲技術(shù),將該用戶的所有關(guān)注人信息存取下來(lái),包括用戶的豆瓣網(wǎng)主頁(yè)名以及URL信息,作為本次項(xiàng)目的一度關(guān)注用戶;通過(guò)同樣的方式,將一度關(guān)注用戶的關(guān)注人信息采集下來(lái),作為項(xiàng)目的二度關(guān)注用戶。將以上涉及的豆瓣用戶信息存入到MongoDB數(shù)據(jù)庫(kù)中。
4)從數(shù)據(jù)庫(kù)中讀取豆瓣用戶的主頁(yè)鏈接,以一個(gè)用戶為單位,使用Python程序模擬登錄瀏覽器獲得用戶的讀書喜好信息,包括想讀、在讀、讀過(guò)和書評(píng)中的書名與書籍鏈接。
5)將目標(biāo)用戶、一度關(guān)注用戶和二度關(guān)注用戶讀書喜好信息中涉及的所有圖書進(jìn)行詳細(xì)信息采集并保存。
4 爬蟲程序?qū)崿F(xiàn)
1)從網(wǎng)頁(yè)中獲取用戶關(guān)注人信息并存入MongoDB數(shù)據(jù)庫(kù):本次研究選用豆瓣用戶讀庫(kù)作為目標(biāo)用戶(URL:https://www.douban.com/people/19743667/),它符合我們的研究條件,有讀書喜好信息與評(píng)論等信息。在獲取讀庫(kù)關(guān)注人信息之前,需要使用正確的網(wǎng)站賬號(hào)與密碼登錄網(wǎng)站才能查看。這里我們使用Python語(yǔ)言對(duì)豆瓣網(wǎng)站進(jìn)行模擬登錄:首先,設(shè)置User-Agent,這是網(wǎng)站設(shè)置反爬蟲最基本的機(jī)制;其次要設(shè)置好data,在登錄的過(guò)程中會(huì)涉及表單的提交,我們需要將豆瓣賬號(hào)以及相應(yīng)的賬號(hào)密碼等信息填入,以便通過(guò)代碼正確登錄豆瓣網(wǎng)站,最后設(shè)置一個(gè)函數(shù)用來(lái)處理網(wǎng)站的驗(yàn)證碼問(wèn)題。在處理好豆瓣網(wǎng)站模擬登錄的問(wèn)題之后,在網(wǎng)站中點(diǎn)擊“關(guān)注人”選項(xiàng),發(fā)現(xiàn)用戶關(guān)注人的詳細(xì)信息都存儲(chǔ)在“讀庫(kù)”主頁(yè)鏈接尾部加上“contact”的網(wǎng)址下,通過(guò)查看該網(wǎng)址的頁(yè)面源代碼,準(zhǔn)確地找到存儲(chǔ)信息的位置。使用requests模塊對(duì)讀庫(kù)的關(guān)注人頁(yè)面的源代碼進(jìn)行解析,使用find_all()方法定位到所有用戶名和用戶主頁(yè)鏈接的位置并存儲(chǔ)下來(lái)。
2)根據(jù)用戶主頁(yè)鏈接采集用戶讀書喜好信息并保存:保存在數(shù)據(jù)庫(kù)中的豆瓣用戶主頁(yè)鏈接會(huì)出現(xiàn)URL重復(fù)的問(wèn)題。例如,某用戶既是一度關(guān)注用戶也是二度關(guān)注用戶,所以我們?cè)诓杉脩粝埠眯畔⒅靶枰獙?duì)存儲(chǔ)下來(lái)的用戶主頁(yè)鏈接進(jìn)行去重處理,提高程序采集效率:將采集多信息的用戶的主頁(yè)鏈接存儲(chǔ)下來(lái),采集下一個(gè)用戶的主頁(yè)鏈接之前先判斷該網(wǎng)址是否存儲(chǔ)過(guò),如果已經(jīng)采集過(guò)信息,則舍棄當(dāng)前鏈接,繼續(xù)從數(shù)據(jù)庫(kù)中讀取下一條用戶主頁(yè)鏈接;否則,根據(jù)用戶主頁(yè)鏈接,查找并存儲(chǔ)用戶的讀書喜好信息。用戶主頁(yè)鏈接與實(shí)際該用戶存儲(chǔ)書籍喜好鏈接不一致,以我們的目標(biāo)用戶讀庫(kù)為例:讀庫(kù)的主頁(yè)鏈接為https://www.douban.com/people/19743667/,而讀庫(kù)讀書喜好鏈接為https://book.douban.com/people/19743667/,因鏈接不同,所以在采集讀庫(kù)信息時(shí),要進(jìn)行字符串的替換操作。將“www”替換為“book”,以保證程序正確運(yùn)行,采集到我們需要的詳細(xì)讀書喜好信息。書籍詳細(xì)信息采用同樣原理。
3)延時(shí)等待:在程序運(yùn)行的過(guò)程中,要考慮到不要因?yàn)樽约旱臄?shù)據(jù)爬取程序給對(duì)方的服務(wù)器造成壓力,所以在每段程序運(yùn)行時(shí)都加入適當(dāng)?shù)难訒r(shí)等待處理。禮貌爬行,以免頻繁訪問(wèn)給網(wǎng)站帶來(lái)過(guò)度負(fù)載。[8]
4)翻頁(yè)處理:在數(shù)據(jù)采集中,我們?nèi)粝雽?duì)數(shù)據(jù)進(jìn)行全面、完整地采集,需要在設(shè)計(jì)網(wǎng)絡(luò)爬蟲程序時(shí)考慮到模擬翻頁(yè)的功能。觀察網(wǎng)站的鏈接變化規(guī)律,通過(guò)更改鏈接尾部信息可實(shí)現(xiàn)翻頁(yè)操作,以采集用戶在讀信息為例,部分代碼如下:
for i in range(0,10):
URL=URL_do+do?start=+str(i*15) #URL_do 為用戶在讀書籍主頁(yè)鏈接
5)數(shù)據(jù)存儲(chǔ):隨著大數(shù)據(jù)的發(fā)展,數(shù)據(jù)內(nèi)容的多樣性帶動(dòng)了非結(jié)構(gòu)化存儲(chǔ)數(shù)據(jù)的發(fā)展。[9]MongoDB是NoSQL存儲(chǔ)結(jié)構(gòu)下的文檔型數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫。MongoDB最大的特點(diǎn)是它支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。本項(xiàng)目使用MongoDB存儲(chǔ)用戶的一度關(guān)注用戶和二度關(guān)注用戶的主頁(yè)鏈接。XML作為半結(jié)構(gòu)化的語(yǔ)言,因其能預(yù)先定義標(biāo)記等優(yōu)勢(shì)被普遍應(yīng)用于非結(jié)構(gòu)化到結(jié)構(gòu)化的信息轉(zhuǎn)換中。[10]XML文件使用純文本語(yǔ)言編寫,且語(yǔ)法簡(jiǎn)單,便于讀者理解與學(xué)習(xí)。Python語(yǔ)言自身提供了對(duì)XML文件進(jìn)行操作的模塊,簡(jiǎn)化信息存取操作,提高程序運(yùn)行效率。因此我們使用XML文件格式存儲(chǔ)用戶的讀書信息。以單個(gè)用戶為單位進(jìn)行讀書信息存儲(chǔ)。每個(gè)XML文件中包括該用戶的主頁(yè)鏈接、用戶名,想讀、在讀、讀過(guò)書籍的名稱以及鏈接、用戶的評(píng)論信息(評(píng)論書籍名稱、鏈接、評(píng)論內(nèi)容)。
5 結(jié)束語(yǔ)
Python語(yǔ)言語(yǔ)法簡(jiǎn)潔,功能強(qiáng)大,具有豐富的標(biāo)準(zhǔn)庫(kù)。本文探討了基于Python的豆瓣網(wǎng)站用戶相關(guān)信息采集程序的設(shè)計(jì)與實(shí)現(xiàn)。通過(guò)模擬用戶登錄豆瓣網(wǎng)站進(jìn)行指定用戶的讀書喜好相關(guān)信息采集并保存至本地。為后續(xù)的數(shù)據(jù)分析提供數(shù)據(jù)支持。本文探討的程序具有針對(duì)性強(qiáng)、操作簡(jiǎn)單等優(yōu)點(diǎn)。在今后的學(xué)習(xí)中將會(huì)根據(jù)所學(xué)知識(shí)進(jìn)一步優(yōu)化爬蟲程序。
參考文獻(xiàn):
[1] 任龍龍. 大數(shù)據(jù)時(shí)代的個(gè)人信息民法保護(hù)[D]. 北京: 對(duì)外經(jīng)貿(mào)大學(xué), 2017.
[2] Netcraft. There are over 1.6 billion Websites in the World Wide Web(WWW)[EB/OL]. [2008-03-28]. http://it.hexun.com/2008-03-28/104849372.html.
[3] The indexed web contains at least 21.7 billion pages[EB/OL]. [2009-11-11]. http://www.worldwidewebsize.com/index.php?lang=EN.
[4] 虞璐. Web2.0時(shí)代豆瓣網(wǎng)的網(wǎng)絡(luò)文化研究[D]. 南京: 南京師范大學(xué), 2012.
[5] 于娟, 劉強(qiáng). 主題網(wǎng)絡(luò)爬蟲研究綜述[J]. 計(jì)算機(jī)工程與科學(xué), 2015, 37(2).
[6] 崔慶才. Python3 網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)[M]. 北京: 人民郵電出版社, 2018: 93.
[7] 安子建. 基于Scrapy框架的網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)與數(shù)據(jù)抓取分析[D]. 長(zhǎng)春: 吉林大學(xué), 2017.
[8] 于娟, 劉強(qiáng). 主題網(wǎng)絡(luò)爬蟲研究綜述[J]. 計(jì)算機(jī)工程與科學(xué), 2015, 37(2).
[9] 李紀(jì)偉, 段中帥, 王順曄. 非結(jié)構(gòu)化數(shù)據(jù)庫(kù)MongoDB的數(shù)據(jù)存儲(chǔ)[J]. 電腦知識(shí)與技術(shù), 2018, 14(27): 7-9.
[10] 楊晶, 周雙娥. 一種基于XML的非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換方法[J]. 計(jì)算機(jī)科學(xué), 2017, 44(S2): 414-417.
【通聯(lián)編輯:謝媛媛】