爬行動物能做什么?一句話,一般來說,通過瀏覽器可以獲得的數(shù)據(jù),爬蟲都能得到。
這句話可以說是包羅萬象。一是說明了爬蟲的本質(zhì)是一個服務(wù)端,實現(xiàn)的功能類似于瀏覽器;二是說明了爬蟲的界限,如果不能正常訪問到的數(shù)據(jù)就不能通過爬蟲獲?。蝗桥老x的最高境界,只要是瀏覽器能正常訪問的都可以用爬蟲獲取。更多爬蟲的神奇用處。下面我們講講爬蟲的基本結(jié)構(gòu)和簡單實現(xiàn)。這篇文章我不準(zhǔn)備詳細(xì)地講具體怎么寫爬蟲,只是先用一個非常簡單的實現(xiàn),給大家看看爬蟲是個什么樣子。詳細(xì)的內(nèi)容我們后面一個一個慢慢說。
一、爬蟲的基本結(jié)構(gòu)
讓我們忽略掉來自各種各樣的資料對于爬蟲結(jié)構(gòu)的描述,把問題盡可能地描述簡單一點。前面說到,爬蟲是一個獲取正常瀏覽器可以獲取的數(shù)據(jù)的自動化獲取程序。那么,從這個功能出發(fā),我們需要干的事情其實就兩件事情:找到我們需要的網(wǎng)頁,然后把他們一個一個處理一遍。(這句話很重要,我們在后面的后面講到海量數(shù)據(jù)爬取策略的時候還要回到這句話。)那么問題就來了:一,怎么找到我們需要的網(wǎng)頁的那個入口?二,怎么處理我們需要處理的網(wǎng)頁?
對于單個頁面來說,入口的來源有兩種,一種是已知地址,比如我們院的網(wǎng)站的教學(xué)研究人員:教學(xué)研究人員;
另外一種是你可以通過前面爬下來的網(wǎng)頁中獲取入口,比如這個頁面上所有老師的個人主頁。這一點很重要,后面我們在把小爬蟲逐步變大的時候還要反復(fù)回到這里。
好的,后面的部分,讓我們通過解決第二個問題(處理網(wǎng)頁)的過程,順便看看怎么解決第一個問題(獲取更多入口)。我們一起開看看一個單頁爬蟲是怎么實現(xiàn)的。
二、爬蟲實例:簡單的單頁爬蟲
好了,現(xiàn)在我們要處理網(wǎng)頁了??墒蔷W(wǎng)頁要怎么處理呢?讓我們回憶一下我們使用瀏覽器的過程:你先把一個地址復(fù)制進(jìn)瀏覽器的框框里面,或者點開一個鏈接;然后瀏覽器的進(jìn)度條跑一下(有可能快也有可能慢),然后我們就在瀏覽器里面看到了數(shù)據(jù)。首先,進(jìn)度條跑的過程完成了一個對網(wǎng)頁的請求,然后瀏覽器把請求下來的數(shù)據(jù)進(jìn)行處理,然后就輸出出來。這是一個極其簡化但是不太準(zhǔn)確的對于瀏覽器工作原理的描述。那么爬蟲和瀏覽器有什么不同呢?一般來說,我們是只需要解析網(wǎng)頁,而不需要渲染瀏覽器環(huán)境的;另外,我們需要特定網(wǎng)頁的特點數(shù)據(jù),因此要用一定的方式把數(shù)據(jù)組織并儲存起來。所以,爬蟲的核心模塊有三個:請求、解析、儲存。
首先我們給一個入口:教學(xué)研究人員。
這就是我們今天要處理的目標(biāo)網(wǎng)頁。我們今天要實現(xiàn)的目的就是把這個頁面上所有老師的姓名和個人主頁的鏈接(也就是可能的下一次爬蟲的入口)提取出來。下面開始寫爬蟲吧~
1、請求
這里我們使用的package是requests。這是一個第三方模塊(具體怎么下載以后再說),對HTTP協(xié)議進(jìn)行了高度封裝,非常好用。所謂HTTP協(xié)議,簡單地說就是一個請求過程。我們先不管這玩意是啥,以后再討論。這個部分,我們要實現(xiàn)的目的是把網(wǎng)頁請求(或者說下載)下來。
首先我們導(dǎo)入requests:
import requests
下面調(diào)用requests的get函數(shù),把網(wǎng)頁請求下來:
r = reque(';)返回的“r”的是一個包含了整個HTTP協(xié)議需要的各種各樣的東西的對象。我們先不管都有啥,先把我們需要的網(wǎng)頁提取出來:
html = r.content
好了,到這一步我們已經(jīng)獲取了網(wǎng)頁的源代碼。具體源代碼是什么樣的呢?右鍵,點擊“查看源文件”或者“查看源”就可以看到:
view-source:http://www.wise.xmu.edu.cn/people/faculty
2、解析
當(dāng)然從這一大坨代碼里面找信息太麻煩了。我們可以用瀏覽器提供的另外一個工具:審查元素。這里我們先不講怎么使用審查元素,先從源代碼里面找。找到的我們需要的信息如下:
這里我們使用bs4來解析。bs4是一個非常好的解析網(wǎng)頁的庫,后面我們會詳細(xì)介紹。這次的解析先給大家看bs4里面最常用的幾個BeautifulSoup對象的方法(method)。我們使用的這幾個方法,主要是通過HTML的標(biāo)簽和標(biāo)簽里面的參數(shù)來定位,然后用特定方法(method)提取數(shù)據(jù)。
首先還是導(dǎo)入package:
from bs4 import BeautifulSoup
然后創(chuàng)建一個BeautifulSoup對象:
soup = BeautifulSoup(html,';) #是解析器
下面我們根據(jù)我們看到的網(wǎng)頁提取。首先提取我復(fù)制的這部分的代碼的第一行,先定位到這部分代碼:
div_people_list = ('div', attrs={'class': 'people_list'})
這里我們使用了BeautifulSoup對象的find方法。這個方法的意思是找到帶有‘div’這個標(biāo)簽并且參數(shù)包含" class = 'people_list' "的HTML代碼。如果有多個的話,find方法就取第一個。那么如果有多個呢?正好我們后面就遇到了,現(xiàn)在我們要取出所有的“a”標(biāo)簽里面的內(nèi)容:
a_s = div_('a', attrs={'target': '_blank'})
這里我們使用find_all方法取出所有標(biāo)簽為“a”并且參數(shù)包含“ target = ‘_blank‘ ”的代碼,返回一個列表?!癮”標(biāo)簽里面的“href”參數(shù)是我們需要的老師個人主頁的信息,而標(biāo)簽里面的文字是老師的姓名。我們繼續(xù):
for a in a_s: url = a['href'] name = a.get_text()這里我們使用BeautifulSoup支持的方法,使用類似于Python字典索引的方式把“a”標(biāo)簽里面“href”參數(shù)的值提取出來,賦值給url(Python實際上是對對象的引用),用get_text()方法把標(biāo)簽里面的文字提起出來。
事實上,使用這四個方法就可以正常地解析大部分HTML了。不過如果只用這四個方法,很多程序會寫的異常原始。所以我們后面再繼續(xù)介紹更多解析方法。
1.儲存
這里我們先弱化一下具體的儲存方法,先輸出到控制臺上面。我們在剛才的代碼的基礎(chǔ)上加一行代碼:
for a in a_s: url = a['href'] name = a.get_text() print name,url使用print關(guān)鍵詞把得到的數(shù)據(jù)print出來。讓我們看看結(jié)果:
好的,到這里一個原型就完成了。這就是一個非常簡單的爬蟲,總代碼不過十幾行。復(fù)雜到幾百幾千行的爬蟲,都是在這樣的一個原型的基礎(chǔ)上不斷深化、不斷完善得到的。
End.
作者:iGuo(中國統(tǒng)計網(wǎng)特邀認(rèn)證作者)
本文為頭條號作者原創(chuàng)。未經(jīng)允許,不得轉(zhuǎn)載。
運行人員:中國統(tǒng)計網(wǎng)小編(微信號:itongjilove)
中國統(tǒng)計網(wǎng),是國內(nèi)最早的大數(shù)據(jù)學(xué)習(xí)網(wǎng)站,公眾號:中國統(tǒng)計網(wǎng)
1.《【爬蟲社區(qū)】Python入門(一):爬蟲基本結(jié)構(gòu)&簡單實例》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【爬蟲社區(qū)】Python入門(一):爬蟲基本結(jié)構(gòu)&簡單實例》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/yule/3166731.html