程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 博客爬取系統,博客爬取

博客爬取系統,博客爬取

編輯:關於PHP編程

博客爬取系統,博客爬取


引言

  周末沒事干,無聊,使用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\s*?id=\"cb_post_title_url\"[^>]*?>(.*?)<\/a>#is

正文,正文部分是可以通過正則表達式的高級特性平衡組很容易獲取到的,但弄了半天發現php好像對平衡組支持的不是很好,所以放棄額平衡組,在html源碼中發現通過下面的正則也可以很容易匹配到文章正文的內容,每篇文章基本都有下圖中的內容

#(<div\s*?id=\"cnblogs_post_body\"[^>]*?>.*)<div\s*id=\"blog_post_info_block\">#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([email protected])所有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved