李鑫欣 關(guān)菁華
摘要:21世紀(jì)是大數(shù)據(jù)時(shí)代。隨著互聯(lián)網(wǎng)的發(fā)展與普及,人們在互聯(lián)網(wǎng)上會(huì)留下大量的“個(gè)人信息足跡”。網(wǎng)絡(luò)數(shù)據(jù)量呈指數(shù)級(jí)增長,與此同時(shí)人們獲取想要的信息的難度也大幅度提高。搜索引擎的出現(xiàn)和發(fā)展提高了用戶檢索信息的效率。網(wǎng)絡(luò)爬蟲是搜索引擎相關(guān)技術(shù)的重要組成部分,爬蟲技術(shù)的發(fā)展助推信息資源獲取更加高效便捷?;赑ython技術(shù)對(duì)目標(biāo)網(wǎng)站——豆瓣網(wǎng)用戶讀書喜好信息(包括用戶想讀、在讀、讀過、評(píng)論等)進(jìn)行采集與存儲(chǔ),為后期的個(gè)性化推薦方法研究提供數(shù)據(jù)支持。在數(shù)據(jù)采集過程中涉及URL去重、模擬登錄、翻頁等技術(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)以及無處不在的傳感器和微處理器的存在,人們無時(shí)無刻不留下“數(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)上含有超過16億的網(wǎng)站,[2]而這些被索引的網(wǎng)站包含至少217億的頁面。[3]信息產(chǎn)業(yè)日益發(fā)達(dá),使得人們意識(shí)到對(duì)于海量數(shù)據(jù)的挖掘與采集具有重要意義。人們在生產(chǎn)生活中會(huì)產(chǎn)生大量的數(shù)據(jù),將這些數(shù)據(jù)加以利用又可以更好地服務(wù)于人們的生產(chǎn)生活。作為中國最早的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ù),包括讀書、電影、音樂、小組、同城、FM、時(shí)間、豆品等,深受互聯(lián)網(wǎng)用戶的喜愛。早在2012年豆瓣的月度覆蓋獨(dú)立用戶數(shù)已超過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)行采集,其中包括用戶想讀書籍、在讀書籍、讀過書籍以及書籍短評(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)頁并提取網(wǎng)頁內(nèi)容的程序,是搜索引擎的信息獲取渠道。[5]我們可以把互聯(lián)網(wǎng)比作一張大網(wǎng),而網(wǎng)絡(luò)爬蟲就是在網(wǎng)上爬行的蜘蛛。把網(wǎng)的節(jié)點(diǎn)比作一個(gè)個(gè)網(wǎng)頁,爬蟲爬到這就相當(dāng)于訪問了該頁面,獲取了其信息。可以把節(jié)點(diǎn)之間的連線比做網(wǎng)頁與網(wǎng)頁之間的連接關(guān)系,這樣蜘蛛通過一個(gè)節(jié)點(diǎn)后,可以順著節(jié)點(diǎn)連線繼續(xù)爬行到達(dá)下一個(gè)節(jié)點(diǎn),即通過一個(gè)網(wǎng)頁繼續(xù)獲取后續(xù)的網(wǎng)頁,這樣整個(gè)網(wǎng)的節(jié)點(diǎn)便可以被蜘蛛全部爬行到,網(wǎng)站的數(shù)據(jù)就會(huì)被抓取下來了。[6]
2.2 網(wǎng)絡(luò)爬蟲現(xiàn)狀分析
網(wǎng)絡(luò)爬蟲技術(shù)發(fā)展至今,研究人員已經(jīng)為我們提供了許多開源庫與框架供我們學(xué)習(xí)和使用。近年來,網(wǎng)絡(luò)爬蟲技術(shù)發(fā)展迅速,研究人員在原有技術(shù)的基礎(chǔ)上不斷地對(duì)程序進(jìn)行優(yōu)化與發(fā)展。目前知識(shí)版權(quán)的概念正在深入人心,網(wǎng)站網(wǎng)頁作為內(nèi)容的載體,其所保存的信息也屬于知識(shí)產(chǎn)權(quán)的范疇,理應(yīng)受到版權(quán)協(xié)議的保護(hù)。所以有相當(dāng)數(shù)量的網(wǎng)頁并不希望其出產(chǎn)的內(nèi)容被網(wǎng)絡(luò)爬蟲輕松地探測到并下載。[7]
因此,許多網(wǎng)站對(duì)于網(wǎng)絡(luò)爬蟲行為采取一定的限制措施,阻攔IP地址單位時(shí)間內(nèi)對(duì)于網(wǎng)站服務(wù)器的訪問次數(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)行采集,包括想讀、在讀、讀過、書評(píng)涉及的數(shù)據(jù)詳細(xì)信息。
研究思路:
1)在豆瓣讀書網(wǎng)站上隨機(jī)找一位用戶,要求他的個(gè)人主頁中有一定的關(guān)注人和讀書喜好信息。找到符合要求的人作為我們的目標(biāo)用戶,將目標(biāo)用戶的URL(Uniform Resource Locator )保存下來。
2)爬取策略選擇。常見的網(wǎng)頁抓取策略采用廣度優(yōu)先算法和深度優(yōu)先算法。簡單來說,廣度優(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)性問題,采取廣度優(yōu)先算法進(jìn)行程序設(shè)計(jì)。在盡可能多地采集用戶一度關(guān)注用戶的主頁鏈接后,再對(duì)用戶二度關(guān)注用戶信息進(jìn)行采集。
3)根據(jù)目標(biāo)用戶的URL,使用基于Python語言的網(wǎng)絡(luò)爬蟲技術(shù),將該用戶的所有關(guān)注人信息存取下來,包括用戶的豆瓣網(wǎng)主頁名以及URL信息,作為本次項(xiàng)目的一度關(guān)注用戶;通過同樣的方式,將一度關(guān)注用戶的關(guān)注人信息采集下來,作為項(xiàng)目的二度關(guān)注用戶。將以上涉及的豆瓣用戶信息存入到MongoDB數(shù)據(jù)庫中。
4)從數(shù)據(jù)庫中讀取豆瓣用戶的主頁鏈接,以一個(gè)用戶為單位,使用Python程序模擬登錄瀏覽器獲得用戶的讀書喜好信息,包括想讀、在讀、讀過和書評(píng)中的書名與書籍鏈接。
5)將目標(biāo)用戶、一度關(guān)注用戶和二度關(guān)注用戶讀書喜好信息中涉及的所有圖書進(jìn)行詳細(xì)信息采集并保存。
4 爬蟲程序?qū)崿F(xiàn)
1)從網(wǎng)頁中獲取用戶關(guān)注人信息并存入MongoDB數(shù)據(jù)庫:本次研究選用豆瓣用戶讀庫作為目標(biāo)用戶(URL:https://www.douban.com/people/19743667/),它符合我們的研究條件,有讀書喜好信息與評(píng)論等信息。在獲取讀庫關(guān)注人信息之前,需要使用正確的網(wǎng)站賬號(hào)與密碼登錄網(wǎng)站才能查看。這里我們使用Python語言對(duì)豆瓣網(wǎng)站進(jìn)行模擬登錄:首先,設(shè)置User-Agent,這是網(wǎng)站設(shè)置反爬蟲最基本的機(jī)制;其次要設(shè)置好data,在登錄的過程中會(huì)涉及表單的提交,我們需要將豆瓣賬號(hào)以及相應(yīng)的賬號(hào)密碼等信息填入,以便通過代碼正確登錄豆瓣網(wǎng)站,最后設(shè)置一個(gè)函數(shù)用來處理網(wǎng)站的驗(yàn)證碼問題。在處理好豆瓣網(wǎng)站模擬登錄的問題之后,在網(wǎng)站中點(diǎn)擊“關(guān)注人”選項(xiàng),發(fā)現(xiàn)用戶關(guān)注人的詳細(xì)信息都存儲(chǔ)在“讀庫”主頁鏈接尾部加上“contact”的網(wǎng)址下,通過查看該網(wǎng)址的頁面源代碼,準(zhǔn)確地找到存儲(chǔ)信息的位置。使用requests模塊對(duì)讀庫的關(guān)注人頁面的源代碼進(jìn)行解析,使用find_all()方法定位到所有用戶名和用戶主頁鏈接的位置并存儲(chǔ)下來。
2)根據(jù)用戶主頁鏈接采集用戶讀書喜好信息并保存:保存在數(shù)據(jù)庫中的豆瓣用戶主頁鏈接會(huì)出現(xiàn)URL重復(fù)的問題。例如,某用戶既是一度關(guān)注用戶也是二度關(guān)注用戶,所以我們在采集用戶喜好信息之前需要對(duì)存儲(chǔ)下來的用戶主頁鏈接進(jìn)行去重處理,提高程序采集效率:將采集多信息的用戶的主頁鏈接存儲(chǔ)下來,采集下一個(gè)用戶的主頁鏈接之前先判斷該網(wǎng)址是否存儲(chǔ)過,如果已經(jīng)采集過信息,則舍棄當(dāng)前鏈接,繼續(xù)從數(shù)據(jù)庫中讀取下一條用戶主頁鏈接;否則,根據(jù)用戶主頁鏈接,查找并存儲(chǔ)用戶的讀書喜好信息。用戶主頁鏈接與實(shí)際該用戶存儲(chǔ)書籍喜好鏈接不一致,以我們的目標(biāo)用戶讀庫為例:讀庫的主頁鏈接為https://www.douban.com/people/19743667/,而讀庫讀書喜好鏈接為https://book.douban.com/people/19743667/,因鏈接不同,所以在采集讀庫信息時(shí),要進(jìn)行字符串的替換操作。將“www”替換為“book”,以保證程序正確運(yùn)行,采集到我們需要的詳細(xì)讀書喜好信息。書籍詳細(xì)信息采用同樣原理。
3)延時(shí)等待:在程序運(yùn)行的過程中,要考慮到不要因?yàn)樽约旱臄?shù)據(jù)爬取程序給對(duì)方的服務(wù)器造成壓力,所以在每段程序運(yùn)行時(shí)都加入適當(dāng)?shù)难訒r(shí)等待處理。禮貌爬行,以免頻繁訪問給網(wǎng)站帶來過度負(fù)載。[8]
4)翻頁處理:在數(shù)據(jù)采集中,我們?nèi)粝雽?duì)數(shù)據(jù)進(jìn)行全面、完整地采集,需要在設(shè)計(jì)網(wǎng)絡(luò)爬蟲程序時(shí)考慮到模擬翻頁的功能。觀察網(wǎng)站的鏈接變化規(guī)律,通過更改鏈接尾部信息可實(shí)現(xiàn)翻頁操作,以采集用戶在讀信息為例,部分代碼如下:
for i in range(0,10):
URL=URL_do+do?start=+str(i*15) #URL_do 為用戶在讀書籍主頁鏈接
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ù)庫,由C++語言編寫。MongoDB最大的特點(diǎn)是它支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。本項(xiàng)目使用MongoDB存儲(chǔ)用戶的一度關(guān)注用戶和二度關(guān)注用戶的主頁鏈接。XML作為半結(jié)構(gòu)化的語言,因其能預(yù)先定義標(biāo)記等優(yōu)勢被普遍應(yīng)用于非結(jié)構(gòu)化到結(jié)構(gòu)化的信息轉(zhuǎn)換中。[10]XML文件使用純文本語言編寫,且語法簡單,便于讀者理解與學(xué)習(xí)。Python語言自身提供了對(duì)XML文件進(jìn)行操作的模塊,簡化信息存取操作,提高程序運(yùn)行效率。因此我們使用XML文件格式存儲(chǔ)用戶的讀書信息。以單個(gè)用戶為單位進(jìn)行讀書信息存儲(chǔ)。每個(gè)XML文件中包括該用戶的主頁鏈接、用戶名,想讀、在讀、讀過書籍的名稱以及鏈接、用戶的評(píng)論信息(評(píng)論書籍名稱、鏈接、評(píng)論內(nèi)容)。
5 結(jié)束語
Python語言語法簡潔,功能強(qiáng)大,具有豐富的標(biāo)準(zhǔn)庫。本文探討了基于Python的豆瓣網(wǎng)站用戶相關(guān)信息采集程序的設(shè)計(jì)與實(shí)現(xiàn)。通過模擬用戶登錄豆瓣網(wǎng)站進(jìn)行指定用戶的讀書喜好相關(guān)信息采集并保存至本地。為后續(xù)的數(shù)據(jù)分析提供數(shù)據(jù)支持。本文探討的程序具有針對(duì)性強(qiáng)、操作簡單等優(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]. 長春: 吉林大學(xué), 2017.
[8] 于娟, 劉強(qiáng). 主題網(wǎng)絡(luò)爬蟲研究綜述[J]. 計(jì)算機(jī)工程與科學(xué), 2015, 37(2).
[9] 李紀(jì)偉, 段中帥, 王順曄. 非結(jié)構(gòu)化數(shù)據(jù)庫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)編輯:謝媛媛】