應(yīng)西交利物浦大學(xué)李女士要求,簡(jiǎn)單寫寫我對(duì)爬蟲的理解,沒有什么專業(yè)的東西,沒有干貨,都是思路,很白話,應(yīng)該能看懂。
一般來說,我們從網(wǎng)上獲取信息的方式就是,打開網(wǎng)頁——找到我們需要的信息——復(fù)制粘貼到我們需要的地方——找到我們需要的下一條信息——復(fù)制粘貼到我們需要的地方。在數(shù)據(jù)探索階段或者數(shù)據(jù)量比較少的階段,我們確實(shí)可以采用這種原始的方式,但如果我們需要在線獲取的數(shù)據(jù)有幾百條幾千條甚至幾萬條,且沒有現(xiàn)成的數(shù)據(jù)庫(kù)當(dāng)你一鍵的時(shí)候,人工重復(fù)鼠標(biāo)選擇——鍵盤鍵入——復(fù)制粘貼的過程是既浪費(fèi)時(shí)間又浪費(fèi)資源的過程,而且這個(gè)過程的動(dòng)作是相同或者相似的,那么我們就可以嘗試用給機(jī)器以指令,讓機(jī)器替我們完成這個(gè)事情。
好,如果我們要使用機(jī)器來實(shí)現(xiàn),我們?nèi)绾巫?,這就有了兩種思路,一個(gè)是我直接把網(wǎng)站的鏈接(網(wǎng)址:URL)交給電腦,電腦去解析這個(gè)鏈接所對(duì)應(yīng)的網(wǎng)頁的源代碼,也就是我們?cè)贑hrome下面右鍵——查看網(wǎng)頁源代碼得到的東西,從網(wǎng)頁的源代碼中找到我們需要的東西,然后以變量的形式存儲(chǔ)。這個(gè)方式非常簡(jiǎn)單直白,適合同樣簡(jiǎn)單直白的網(wǎng)頁。在R里面,可以通過Rcurl和XML包的聯(lián)用來解決(最原始),后來rvest包的開發(fā)大大簡(jiǎn)化了這個(gè)過程,使得對(duì)文本、數(shù)字甚至表格的獲取更加簡(jiǎn)單。具體用法和案例網(wǎng)上有很多,可以自行百度。
當(dāng)然,這樣的網(wǎng)頁僅限于爬蟲剛剛開始的時(shí)期,隨著網(wǎng)速提高和反爬蟲的應(yīng)用,網(wǎng)頁開始使用各種異步加載和隱藏URL的方式,那么我們就需要更復(fù)雜的請(qǐng)求和等待方式。此外,我們可以換一個(gè)思路,剛剛我們介紹了鼠標(biāo)鍵盤在瀏覽器上的的點(diǎn)擊和輸入獲取信息的方式,我們也可以通過程序,模擬一個(gè)瀏覽器,通過代碼模擬鼠標(biāo)的點(diǎn)擊指令和鍵盤的輸入指令,來實(shí)現(xiàn)網(wǎng)頁更新,以加載出我們需要的數(shù)據(jù),并進(jìn)行提取。在R中可以使用來實(shí)現(xiàn),這個(gè)包是基于Java寫的,所以需要配置系統(tǒng)環(huán)境,我這邊R的使用有些問題,我只能使用Python里面的,這倆的原理和思路是一樣的。
我想在這里給大家介紹的是如何在打開網(wǎng)頁之后找到我們需要的東西。
現(xiàn)在我們來隨便打開一個(gè)網(wǎng)站。
我們通過在Chrome中可以右鍵查看網(wǎng)頁源碼,于是得到了一堆看不懂的東西。
現(xiàn)在我們仔細(xì)觀察一下這一堆看不懂的東西,我們發(fā)現(xiàn)這些東西絕大部分都有個(gè)相似的外殼。
?hello?world?
一個(gè)大于號(hào)一個(gè)小于號(hào)組成了一個(gè)“標(biāo)簽”,兩個(gè)一組,不帶斜杠的表示,這個(gè)標(biāo)簽里的內(nèi)容開始了,帶斜杠的表示這個(gè)標(biāo)簽的內(nèi)容結(jié)束了。以文本的形式存在,這就是傳說中的html,也就是超文本標(biāo)簽語言,而我們要找的東西就放在一個(gè)個(gè)標(biāo)簽內(nèi),接下來列舉一些常用的標(biāo)簽類型。
導(dǎo)航欄 主體
段落文字
標(biāo)題 ?#如果h后面跟著數(shù)字就代表幾級(jí)標(biāo)題
一塊內(nèi)容,相當(dāng)于寫文章要分段
除了這些標(biāo)簽外,我們還會(huì)發(fā)現(xiàn)類似于id=“xxx”,class=“xxx”,這些都是最常用的標(biāo)簽屬性,通過這些屬性我們可以快速定位到我們需要的標(biāo)簽,類似于我們?cè)诿枋鋈说臅r(shí)候有性別年齡民族籍貫之類的。當(dāng)然屬性不限于id和class,網(wǎng)頁作者也會(huì)自定義一些屬性,起到的作用是一樣。
那么我們找到了我們需要的內(nèi)容,同時(shí)知道了他所屬的標(biāo)簽類型和標(biāo)簽屬性之后,要如何精準(zhǔn)定位到它呢?這就需要調(diào)用CSS選擇器,也就是通過屬性來一層層找到我們需要的標(biāo)簽。
例如,我們要找一個(gè)id屬性值為search的塊(div)和一個(gè)class值為world的段落,即
">。我們可以這樣寫(在python中,在r中的我還沒寫過):
element1?=?wd.find_element_by_css_selector('div#search')
element2 =?wd.find_element_by_css_selector('p.world')
而上面的代碼中,#特指id屬性,.特指class屬性,這也是最常用的屬性。對(duì)于一些不常用的屬性,和更復(fù)雜的嵌套的寫法,網(wǎng)上也有很多內(nèi)容,大家可以自己找教程。
對(duì)于動(dòng)態(tài)網(wǎng)頁而言,可以通過實(shí)現(xiàn)等待加載、點(diǎn)擊鼠標(biāo)、輸入選項(xiàng)等操作,這些都是在能準(zhǔn)確找到需要的標(biāo)簽的基礎(chǔ)上,模擬瀏覽器操作實(shí)現(xiàn)的,可以百度“ 模擬瀏覽器操作”,有很多教程。
快去學(xué)起來。