......
)
)
最后将所有的链接拼为一个数组返回,让程序循环获取连接中的内容。就像上面的获取层级是2,0级的链内容接获取过了,仅仅用来获取1级中的链接,1级中的所有链接内容也获取过了,仅仅用来保存2级中的链接,等到真正获取内容的时候又会对上面的内容进行一次获取,而且上面的hash数组中的状态都没有用到。。。(有待优化)。
还有一个获取文章的正则,通过分析博客园中的文章内容,发现文章标题、正文部分基本都可以很规则的获取到。标题,标题html代码的形式都是下图的那种格式,可以很轻松的用下面的正则匹配到:
#]*?>(.*?)#is
正文,正文部分是可以通过正则表达式的高级特性平衡组,很容易获取到的,但弄了半天发现php好像对平衡组支持的不是很好,所以放弃额平衡组,在html源码中发现通过下面的正则也可以很容易匹配到文章正文的内容,每篇文章基本都有下图中的内容:
#(
]*?>.*)
#is
正文开始:
正文结束:
«»
博客的发布时间也是可以获取到的,但有些文章在获取发布时间的时候可能会找不到,这个就不列在这里了,有了这些东西就可以爬取内容了。
开始爬取»
开始爬取内容了,最初我设置的爬取深度是2级,初始页面是博客园首页,发现爬取不了多少内容,后来发现博客园首页有个页码导航。
就试图拼接成页码格式#p2,循环200次,以每页为起始页面,深度为2去抓取。但我高兴的太早了,开了几个进程跑了好久程序,抓了几十万条,后来发现完全在重复,都是从第一页中抓取的,因为博客园首页点击导航的时候(除了第一页),都是ajax请求获取到的。看来博客园还是考虑到这个问题,因为大多数人都是只打开首页,不会去点击后面的内容(我可能偶尔会去点击下一页),所以为了在防止初级抓取者去抓取和性能发面做权衡,将第一页设置为静态网页的方式,缓存有效期是几分钟(或者是根据跟新频率,当更新多少篇的时候去更新缓存,或者两者的结合),这也是为什么有时候发布的文章,过一会儿才会显示出来的原因(我猜的^_^)。
难道不能一次性抓取很多内容吗?后来我发现这个地方使用的全部是静态网页。
从"找找看"这个地方获取到的内容都是静态的,包括最下面的导航链接中的所有页面都是静态的,而且,这个搜索右边还有筛选条件,可以更好的提高抓取的质量。好了有了这个入口,就可以获取到好多高质量的文章了,下面是循环抓取100页的代码:
for($i=1;$();
die();
foreach($urls as$key=>$value){
$cnblogs->grap($value);
$cnblogs->save();
}
}
至此,就可以去抓去自己喜欢的东西了,抓取速度不是很快,我在一台普通pc上面开了10个进程,抓了好几个小时,才获取到了40多万条数据,好了看看抓取到的内容稍微优化之后的显示效果,这里面加上了博客园的基础css代码,可以看出效果:
抓取到的内容稍作修改:
原始内容:
再看下文件目录结构,也是用上篇的自制目录生成工具生成的:
«»
今天又想到,抓取的时候用队列应该比较合适,新抓取的链接放在队头,从队尾获取链接的内容并匹配生成新的链接插入队头,这样思路应该更清晰,更简单。
效果还是很不错的,这里再猜下推酷这种专门爬取的网站的工作方式,一个常驻进程,隔一段时间去获取一次内容(比如说首页),如果有新鲜的内容就采集入库,没有的话就放弃这次获取的内容,等待下次获取,当时间很小的时候就可以一篇不漏的抓取的”新鲜“的内容。
这是github地址:github——myBlogs
*请认真填写需求信息,我们会在24小时内与您取得联系。