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(luluyrt@163.com)所有,未经作者本人同意禁止任何形式的转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

www.phpzy.comtrue/php/32119.htmlTechArticle博客爬取系统,博客爬取 引言 周末没事干,无聊,使用php做了个博客抓取系统,我经常访问的是cnblogs,当然从博客园(看看我还是很喜欢博客园的)开始入手了,我的抓取比较简易,...

相关文章

PHP之友评论

今天推荐