有時(shí)候因?yàn)楣ぷ鳌⒆陨淼男枨螅覀兌紩?huì)去瀏覽不同網(wǎng)站去獲取我們需要的數(shù)據(jù),于是爬蟲應(yīng)運(yùn)而生,下面是我在開發(fā)一個(gè)簡單爬蟲的經(jīng)過與遇到的問題。
上一次小白已經(jīng)得到了一個(gè)任勞任怨的網(wǎng)絡(luò)小爬蟲,要是不搞一波小事情似乎對(duì)不太起這個(gè)小爬蟲,于是乎小白又鼓搗鼓搗參考各方大神的資料以倒排索引為基礎(chǔ)原理設(shè)計(jì)了一個(gè)簡答的搜索引擎。
之前的爬蟲只是得到了網(wǎng)頁的源碼而沒有做任何處理,乃是一個(gè)一次性的小爬蟲,所以小白用正則表達(dá)式對(duì)網(wǎng)頁內(nèi)容進(jìn)行匹配得到其中的網(wǎng)址,之后小爬蟲就可以利用這個(gè)自生自滅至死方休的幫我們爬取網(wǎng)頁拉,這里不得不提一下beautifulsoup和正則表達(dá)式了,據(jù)說beautifulsoup模塊是一個(gè)網(wǎng)頁爬取提取的利器,只可惜小寶在做完之后才聽得大名萬分遺憾沒能試用一番,但是正則表達(dá)時(shí)小白可是切身的研究了一丟丟,熟練了(強(qiáng)行熟練)也是非常的好用,比如提取網(wǎng)頁源碼的網(wǎng)址:
link_list = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", html)
這一句就提出個(gè)七七八八來,當(dāng)然這么粗糙魚目混珠的情況也是少不了的,但是還是非常好用的, 雖然看起來很復(fù)雜但是只要掌握了(?<)、(?=)、.、+、?這幾種符號(hào)的用法小白覺得就可以解決大部分問題了, 哦這里還有提一句,正則表達(dá)式似乎不支持嵌套的情形, 大概形如“找到所有前面三個(gè)字符滿足條件A的字符a,條件A是這三個(gè)字符前面的內(nèi)容滿足條件B”巴拉巴拉, 好吧感覺說的好亂讓我們暫且跳過這個(gè)話題。提取處理的匹配如果用findall是存儲(chǔ)在列表中的, 這樣我們就可以在一個(gè)網(wǎng)頁列表中一直加入新找到的鏈接一直重復(fù)爬取,小白這里自認(rèn)為能力有限, 所以就從提取中的網(wǎng)頁鏈接爬取了100個(gè)網(wǎng)頁做一個(gè)輕裝版。這里提個(gè)醒,由于之前html鏈接提取的很粗糙, 所以可能把各種形如網(wǎng)頁鏈接的css文件路徑、圖片路徑什么亂七八糟的給爬下來, 不過我們這里就統(tǒng)一當(dāng)作網(wǎng)頁鏈接在一個(gè)try·except模塊中進(jìn)行connection, 不是鏈接的就會(huì)出現(xiàn)異常我們只要捕獲跳過就又可以愉快的繼續(xù)了~~。
有了爬取下來的網(wǎng)頁內(nèi)容下面就應(yīng)該是得到其中真正呈現(xiàn)在網(wǎng)頁中的東西了。 寫過網(wǎng)頁的同學(xué)們都應(yīng)該知道網(wǎng)頁內(nèi)容一般都在<p><\p>之中,title和鏈接什么的也有對(duì)應(yīng)的標(biāo)簽, 運(yùn)用正則表單式理論上可以分離出來,不過小白親身時(shí)間發(fā)現(xiàn)只匹配一次效果非常不好, 匹配的內(nèi)容的確包括想要的內(nèi)容,但是因?yàn)闃?biāo)簽一般都是嵌套的嘛而且小白技術(shù)畢竟也不好正則表達(dá)式可能表述的也有問題, 所以總是會(huì)將內(nèi)容嵌套在標(biāo)簽中返回,這里就有一個(gè)比較笨的方法供大家參考,咳咳, 既然一次不能得到,那么就對(duì)內(nèi)容進(jìn)行再匹配,咳咳,經(jīng)過了三層匹配外加一些小技巧終于是勉強(qiáng)匹配出來了, 這里代碼過于丑陋就不再貼出來了咳咳。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com