部落格爬取系統,部落格爬取
引言
周末沒事幹,無聊,使用php做了個部落格抓取系統,我經常訪問的是cnblogs,當然從部落格園(看看我還是很喜歡部落格園的)開始入手了,我的抓取比較簡易,擷取網頁內容,然後通過正則匹配,擷取到想要的東西,然後儲存資料庫,當然了,在實際過程中會遇到一些問題。做這個之前已經想好了,要做成可擴充的,以後要是哪天想添加csdn、51cto、新浪部落格這些內容了可以很容易的擴充。
那些東西可以抓取?
首先要說些,這個是個簡易的抓取,不是所有網頁中看到的東西都可以抓取,有些東西是抓取不到的,就像下面這些
比如從連結a開始爬,如果depth是1,擷取玩當前連結的內容就完事,如果depth是2的話,就從a連結的內容中再去按指定的規則匹配連結,對匹配到的連結也做depth為1的處理,以此類推,depth是擷取連結的深度、層級。這樣爬蟲才可以”爬動起來“。
當然了,用一個連結去爬特定的內容,這個爬到的東西是很有限的,或者有可能還沒爬起來就死掉了(往後的層級沒有匹配到內容),所以在爬取的時候可以設定多個起始連結。當然了,在爬取的時候很可能會遇到很多重複的連結,所以還得給抓取到的連結做記號,防止重複擷取相同的內容,造成冗餘。有幾個變數來緩衝這些資訊,格式如下
第一,就是一個hash數組,索引值是url的md5值,狀態是0,維護一個不重複的url數組,形如下面的形式
Array( [bc790cda87745fa78a2ebeffd8b48145] => 0 [9868e03f81179419d5b74b5ee709cdc2] => 0 [4a9506d20915a511a561be80986544be] => 0 [818bcdd76aaa0d41ca88491812559585] => 0 [9433c3f38fca129e46372282f1569757] => 0 [f005698a0706284d4308f7b9cf2a9d35] => 0 [e463afcf13948f0a36bf68b30d2e9091] => 0 [23ce4775bd2ce9c75379890e84fadd8e] => 0 ......)
第二個就是要擷取的url數組,這個地方還可以最佳化,我是將所有的網站連結接全部擷取到數組中,再去迴圈數組擷取內容,就等於是說,所有最大深度減1的內容都擷取了兩次,這裡可以直接在擷取下一級內容的時候順便把內容擷取了,然後上面的數組中狀態修改為1(已經擷取),這樣可以提高效率。先看看儲存連結的數組內容:
Array( [0] => Array ( [0] => http://zzk.cnblogs.com/s?t=b&w=php&p=1 ) [1] => Array ( [0] => http://www.cnblogs.com/baochuan/archive/2012/03/12/2391135.html [1] => http://www.cnblogs.com/ohmygirl/p/internal-variable-1.html [2] => http://www.cnblogs.com/zuoxiaolong/p/java1.html ...... ) [2] => Array ( [0] => http://www.cnblogs.com/ohmygirl/category/623392.html [1] => http://www.cnblogs.com/ohmygirl/category/619019.html [2] => http://www.cnblogs.com/ohmygirl/category/619020.html ...... ))
最後將所有的連結拼為一個數組返回,讓程式迴圈擷取串連中的內容。就像上面的擷取層級是2,0級的鏈內容接擷取過了,僅僅用來擷取1級中的連結,1級中的所有連結內容也擷取過了,僅僅用來儲存2級中的連結,等到真正擷取內容的時候又會對上面的內容進行一次擷取,而且上面的hash數組中的狀態都沒有用到。。。(有待最佳化)。
還有一個擷取文章的正則,通過分析部落格園中的文章內容,發現文章標題、本文部分基本都可以很規則的擷取到
標題,標題html代碼的形式都是的那種格式,可以很輕鬆的用下面的正則匹配到
#]*?>(.*?)<\/a>#is
本文,本文部分是可以通過Regex的進階特性平衡組很容易擷取到的,但弄了半天發現php好像對平衡組支援的不是很好,所以放棄額平衡組,在html源碼中發現通過下面的正則也可以很容易匹配到文章本文的內容,每篇文章基本都有中的內容
#(]*?>.*)#is
開始:
for($i=1;$i<=100;$i++){ echo "PAGE{$i}*************************[begin]***************************\r"; $spidercnblogs = new C\Spidercnblogs("http://zzk.cnblogs.com/s?t=b&w=php&p={$i}"); $urls = $spidercnblogs->spiderUrls(); die(); foreach ($urls as $key => $value) { $cnblogs->grap($value); $cnblogs->save(); } }
至此,就可以去抓去自己喜歡的東西了,抓取速度不是很快,我在一台普通pc上面開了10個進程,抓了好幾個小時,才擷取到了40多萬條資料,好了看看抓取到的內容稍微最佳化之後的顯示效果,這裡面加上了部落格園的基礎css代碼,可以看出效果和
抓取到的內容稍作修改:
原始內容
github——myBlogs
本文著作權歸作者iforever(luluyrt@163.com)所有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文串連,否則保留追究法律責任的權利。
http://www.bkjia.com/PHPjc/948224.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/948224.htmlTechArticle部落格爬取系統,部落格爬取 引言 周末沒事幹,無聊,使用php做了個部落格抓取系統,我經常訪問的是cnblogs,當然從部落格園(看看我還是很喜歡...