周末没事干,无聊,使用php做了个博客抓取系统,我经常访问的是cnblogs,当然从博客园(看看我还是很喜欢博客园的)开始入手了,我的抓取比较简易,获取网页内容,然后通过正则匹配,获取到想要的东西,然后保存数据库,当然了,在实际过程中会遇到一些问题。做这个之前已经想好了,要做成可扩充的,以后要是哪天想添加csdn、51cto、新浪博客这些内容了可以很容易的扩展。
首先要说些,这个是个简易的抓取,不是所有网页中看到的东西都可以抓取,有些东西是抓取不到的,就像下面这些
其中圈红的阅读次数、评论次数、推荐次数、反对次数、评论……,这些是通过js调用ajax动态获取的,所以是获取不到的,其实就一句话,你打开一个网页,然后右键点击查看源代码,在源代码中直接看不到的,这种简易抓取可能就有问题,要抓取那些ajax填充的内容,要想想其他办法,之前看见过一篇文章,有人先通过浏览器加载完网页,然后对整个dom就行筛选(那篇文章也说了,这样效率很低),当然了,拼接这些js请求也是可以的,估计会比较麻烦。
首先说下爬取深度depth
比如从链接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 ......)Tags:博客爬取系统
相关文章列表: