管小衛(wèi)
摘? 要:隨著互聯(lián)網(wǎng)信息技術(shù)的快速發(fā)展和大數(shù)據(jù)時(shí)代的到來(lái),越來(lái)越多用戶(hù)借助于網(wǎng)絡(luò)搜索、在線瀏覽等平臺(tái),進(jìn)行所需要數(shù)據(jù)信息的獲取,而最常用的信息獲取方式為網(wǎng)絡(luò)爬蟲(chóng)。文章從爬蟲(chóng)概念、工作原理、爬蟲(chóng)分類(lèi)和合法性進(jìn)行了探討,并通過(guò)實(shí)例展現(xiàn)了Python爬蟲(chóng)的簡(jiǎn)潔性,望對(duì)學(xué)習(xí)者有所幫助。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲(chóng);搜索引擎;Python
中圖分類(lèi)號(hào):TP393.092 文獻(xiàn)標(biāo)志碼:A? ? ? ? ?文章編號(hào):2095-2945(2020)27-0178-02
Abstract: With the rapid development of Internet information technology and the arrival of the era of big data, more and more users obtain the required data and information with the help of web search, online browsing and other platforms, and the most commonly used way to obtain information is web crawlers. This paper discusses the concept, working principle, classification and legitimacy of reptiles, and shows the conciseness of Python crawlers through examples, in the hope of providing help to learners.
Keywords: Web crawler; search engine; Python
人們?cè)谏睢⒐ぷ鞯犬a(chǎn)生的數(shù)據(jù)量以指數(shù)形式爆炸式增長(zhǎng),如何在大量的數(shù)據(jù)中找到我們需要的數(shù)據(jù)呢?越來(lái)越多用戶(hù)借助于網(wǎng)絡(luò)搜索、在線瀏覽等平臺(tái),進(jìn)行所需要數(shù)據(jù)信息的獲取,而最常用的信息獲取方式為網(wǎng)絡(luò)爬蟲(chóng)。通過(guò)爬蟲(chóng)可以實(shí)現(xiàn)對(duì)海量數(shù)據(jù)信息的查找、保存與顯示。
1 網(wǎng)絡(luò)爬蟲(chóng)概述
1.1 網(wǎng)絡(luò)爬蟲(chóng)及工作原理
網(wǎng)絡(luò)爬蟲(chóng)也被稱(chēng)為網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機(jī)器人,就像一只蜘蛛一樣在互聯(lián)網(wǎng)上沿著URL(統(tǒng)一資源定位)的絲線爬行,下載每一個(gè)URL所指向的網(wǎng)頁(yè),分析頁(yè)面內(nèi)容,它是一個(gè)自動(dòng)下載網(wǎng)頁(yè)的計(jì)算機(jī)程序或自動(dòng)化腳本。爬蟲(chóng)的主要目的是從網(wǎng)頁(yè)中提取相關(guān)信息并保持至本地?cái)?shù)據(jù)庫(kù),形成一個(gè)同互聯(lián)網(wǎng)的鏡像備份。
網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn)原理:首先模擬瀏覽器向服務(wù)器發(fā)送正常的http(https)請(qǐng)求,服務(wù)器正常響應(yīng)后,主機(jī)將收到包含所需信息的網(wǎng)頁(yè)代碼。然后主機(jī)使用過(guò)濾模塊將所需信息從網(wǎng)頁(yè)代碼中過(guò)濾出來(lái)。如果一個(gè)模塊無(wú)法完全過(guò)濾有效信息,可以采取多個(gè)模塊協(xié)作的方式。
1.2 網(wǎng)絡(luò)爬蟲(chóng)的價(jià)值
(1)爬取數(shù)據(jù),進(jìn)行市場(chǎng)調(diào)研和商業(yè)分析。如想要了解某地區(qū)的房源信息。爬取鏈家、安居客等房屋買(mǎi)賣(mài)平臺(tái)提供的信息,進(jìn)行分析房?jī)r(jià)變化的趨勢(shì),從而得到自己想要的結(jié)果。也可以通過(guò)抓取各個(gè)招聘網(wǎng)站的招聘信息,從而分析出目前哪些崗位競(jìng)爭(zhēng)激烈,你想要應(yīng)聘的崗位在你所在的地區(qū)都有哪些公司在招聘,從而做到面試前心里有數(shù)。
(2)作為機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘的原始數(shù)據(jù)。如要做一個(gè)推薦系統(tǒng),可以去爬取更多維度的數(shù)據(jù),做出更好的模型;如做圖像識(shí)別,可以爬取大量的圖片作為訓(xùn)練集進(jìn)行訓(xùn)練。
(3)爬取優(yōu)質(zhì)的圖片、文本、視頻資源。如爬取微信公眾號(hào)文章,分析新媒體內(nèi)容運(yùn)營(yíng)策略。
1.3 爬蟲(chóng)的分類(lèi)
網(wǎng)絡(luò)爬蟲(chóng)類(lèi)型有多種,常見(jiàn)的有通用網(wǎng)絡(luò)爬蟲(chóng)和聚焦網(wǎng)絡(luò)爬蟲(chóng)兩種類(lèi)型。
(1)通用網(wǎng)絡(luò)爬蟲(chóng):將英特網(wǎng)上網(wǎng)頁(yè)信息下載到本地,成為網(wǎng)站內(nèi)容的備份,它是搜索引擎系統(tǒng)的重要組成部分。搜索引擎中第一步就是爬蟲(chóng),它是一種自動(dòng)獲取網(wǎng)站中網(wǎng)頁(yè)信息的搜索程序。搜索引擎中爬蟲(chóng)通常還會(huì)抓取和檢索html之外的文字類(lèi)型的文件,如文本文件,word文件,便攜式電子文檔pdf等,但是對(duì)于圖片,視頻等非文字的內(nèi)容則一般不會(huì)處理,另外對(duì)于腳本和一些網(wǎng)頁(yè)中的程序也不會(huì)處理。
(2)聚焦網(wǎng)絡(luò)爬蟲(chóng):針對(duì)某一特定領(lǐng)域的數(shù)據(jù)進(jìn)行抓取的程序,聚焦爬蟲(chóng)與通用爬蟲(chóng)的區(qū)別:前者在獲取網(wǎng)頁(yè)信息后會(huì)對(duì)其內(nèi)容進(jìn)行處理(篩選),確保抓取符合需求的網(wǎng)頁(yè)內(nèi)容。比如旅游網(wǎng)站,金融網(wǎng)站,招聘網(wǎng)站等等;特定領(lǐng)域的聚集爬蟲(chóng)會(huì)使用各種技術(shù)去處理我們需要的信息,所以對(duì)于網(wǎng)站中動(dòng)態(tài)的一些程序,腳本仍會(huì)執(zhí)行,以保證確定能抓取到網(wǎng)站中的數(shù)據(jù)。
1.4 Robots排除協(xié)議(Robots Exclusion Protocol)
也稱(chēng)為網(wǎng)絡(luò)爬蟲(chóng)協(xié)議,它是網(wǎng)站管理者表達(dá)是否希望爬蟲(chóng)自動(dòng)獲取網(wǎng)絡(luò)信息意愿的方法。當(dāng)使用一個(gè)爬蟲(chóng)爬取一個(gè)網(wǎng)站的數(shù)據(jù)時(shí),需要遵守網(wǎng)站所有者針對(duì)所有爬蟲(chóng)所制定的協(xié)議。它通常是一個(gè)叫作robots.txt的文本文件,該協(xié)議通常存放在網(wǎng)站根目錄下,里面規(guī)定了此網(wǎng)站哪些內(nèi)容可以被爬蟲(chóng)獲取,及哪些網(wǎng)頁(yè)是不允許爬蟲(chóng)獲取的。訪問(wèn)網(wǎng)站robots協(xié)議的方法:在域名后面輸入/robots.txt。
2 利用Python爬取房天下新房數(shù)據(jù)
2.1 Python語(yǔ)言簡(jiǎn)介
Python語(yǔ)言語(yǔ)法優(yōu)美、代碼簡(jiǎn)潔、開(kāi)發(fā)效率高、支持模塊多,現(xiàn)已成為人工智能、大數(shù)據(jù)和云計(jì)算時(shí)代首選編程語(yǔ)言。Python包含了十幾萬(wàn)的第三方庫(kù),幾乎涵蓋了計(jì)算機(jī)技術(shù)的各個(gè)領(lǐng)域,具備了良好的編程生態(tài),如requests庫(kù)獲取html頁(yè)面并將其轉(zhuǎn)換成字符串。bs4庫(kù)用于解析和處理html和xml,可以根據(jù)html和xml語(yǔ)法建立解析樹(shù),進(jìn)而高效解析其中的內(nèi)容,re庫(kù)用于處理正則表達(dá)式等。
2.2 常用Python庫(kù)簡(jiǎn)介
網(wǎng)絡(luò)爬蟲(chóng)應(yīng)用一般分為兩個(gè)步驟:一是通過(guò)網(wǎng)絡(luò)連接獲取網(wǎng)頁(yè)的內(nèi)容,可以使用requests庫(kù)中的函數(shù)實(shí)現(xiàn),二是對(duì)獲取的網(wǎng)頁(yè)內(nèi)容進(jìn)行處理,可以使用beautifulsoup4庫(kù)和re庫(kù)來(lái)實(shí)現(xiàn)。
(1)requests 庫(kù),是一個(gè)簡(jiǎn)潔且簡(jiǎn)單的處理http請(qǐng)求的第三方庫(kù),該庫(kù)中的get()方法對(duì)應(yīng)于http的GET方式,獲取網(wǎng)頁(yè)最常用的方法,通過(guò)text屬性獲取http響應(yīng)內(nèi)容的字符串形式。代碼如下:
import requests
r = requests.get(url)
html = r.text
(2)BeautifulSoup4庫(kù)(又稱(chēng)bs4庫(kù))采用面向?qū)ο蟮乃枷氚秧?yè)面當(dāng)做一個(gè)對(duì)象,bs4庫(kù)中最主要的是BeautifulSoup類(lèi),每個(gè)實(shí)例化的對(duì)象相當(dāng)于一個(gè)頁(yè)面。通過(guò)from-import引入bs4庫(kù)中的BeautifulSoup類(lèi)后創(chuàng)建一個(gè)BeautifulSoup對(duì)象,該對(duì)象是一個(gè)樹(shù)形結(jié)構(gòu),包含了html頁(yè)面中的每一個(gè)標(biāo)簽元素,如
、等,也就是說(shuō),每個(gè)元素都是BeautifulSoup對(duì)象的一個(gè)屬性,可以使用“對(duì)象名.屬性名”形式獲取(屬性名為html中標(biāo)簽元素)。當(dāng)需要列出標(biāo)簽對(duì)應(yīng)的所有內(nèi)容或需要找到非第一個(gè)標(biāo)簽時(shí),需要用到BeautifulSoup的find()和find_all()方法,前者返回找到的第一個(gè)結(jié)果,而后者返回全部結(jié)果,find_all()方法可能返回多個(gè)結(jié)果,返回值采用列表形式,find()方法返回字符串形式。
(3)re庫(kù)是Python標(biāo)準(zhǔn)庫(kù),直接通過(guò)import re就可使用,該庫(kù)用于處理正則表達(dá)式,解析和處理html和xml。正則表達(dá)式是一種規(guī)則,只要字符串符合這個(gè)規(guī)則,就算匹配。如抓到的網(wǎng)頁(yè)中的超鏈接、電話號(hào)碼、電子郵箱等,可以使用正則表達(dá)式函數(shù)庫(kù)re來(lái)查找數(shù)據(jù)。例如,通過(guò)re.compile(‘query)函數(shù)注冊(cè)一個(gè)正則表達(dá)式,實(shí)現(xiàn)對(duì)字符串query的檢索、匹配。當(dāng)對(duì)標(biāo)簽屬性檢索時(shí),屬性和對(duì)應(yīng)的值采用JSON格式,如:‘src: re.compile(‘query),其中,鍵值對(duì)中值的部分可以是字符串或者正則表達(dá)式。
(4)numpy庫(kù)是Python提供的用于處理含有同種元素的多維數(shù)組運(yùn)算的第三方庫(kù),一般通過(guò)import numpy as np引入庫(kù),其中as保留字與import一起使用改變后續(xù)的命名空間,也就是說(shuō)給numpy取了一個(gè)別名為np。
2.3 房天下數(shù)據(jù)獲取
本示例主要用到Python的requests庫(kù)、bs4庫(kù)、numpy庫(kù)和re庫(kù)對(duì)數(shù)據(jù)進(jìn)行爬取,爬取的字段包括二手房的標(biāo)題、所在位置、房源的狀態(tài)、單價(jià)等四個(gè)字段。requests庫(kù)用來(lái)獲取網(wǎng)頁(yè)http://newhouse.huaian.fang.com/house/s/b91中新房數(shù)據(jù),bs4庫(kù)則是解析網(wǎng)頁(yè)內(nèi)容,獲取有用數(shù)據(jù)。部分代碼如下:
HTML = requests.get(URL)
SOUP = BeautifulSoup(HTML.content, ‘html.parser, from_encoding=‘gb18030)
last_page = SOUP.select(‘.last)
page_number = int(last_page[0][‘href].split(‘/)[3].split(‘9)[1])
url_demo = ‘http://newhouse.huaian.fang.com/house/s/b9{}/#i+1,name.text.strip(),
for i in range(1,(page_number+1)):
url = url_demo.format(i)
html = requests.get(url)
soup = BeautifulSoup(html.content,‘html.parser,from_encoding=‘gb18030)
3 結(jié)束語(yǔ)
網(wǎng)絡(luò)爬蟲(chóng)技術(shù)是當(dāng)前人工智能和大數(shù)據(jù)領(lǐng)域的一個(gè)研究熱點(diǎn),因特網(wǎng)的搜索引擎利用爬蟲(chóng)所爬取的頁(yè)面信息建立索引,實(shí)現(xiàn)快速搜索。Python是一種被廣泛使用的高級(jí)通用腳本編程語(yǔ)言,從科學(xué)計(jì)算、數(shù)據(jù)處理到人工智能,幾乎可以用于編寫(xiě)各領(lǐng)域的應(yīng)用程序。編寫(xiě)基于Python的網(wǎng)絡(luò)爬蟲(chóng)程序,可以更高效獲取指定信息,定向抓取并分析網(wǎng)頁(yè)資源,具有一定的實(shí)用價(jià)值。
參考文獻(xiàn):
[1]劉航.基于Python的重慶二手房爬取及分析[J].電腦知識(shí)與技術(shù),2019,15(36):6-7,17.
[2]溫婭娜,袁梓梁,何詠宸,等.基于Python爬蟲(chóng)技術(shù)的網(wǎng)頁(yè)解析與數(shù)據(jù)獲取研究[J].現(xiàn)代信息科技,2020,4(1):12-13,16.
[3]成文瑩,李秀敏.基于Python的電影數(shù)據(jù)爬取與數(shù)據(jù)可視化分析研究[J].電腦知識(shí)與技術(shù),2019,15(31):8-10,12.