整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

静态网页的爬取思路 博客爬取系统

......

)

)

最后将所有的链接拼为一个数组返回,让程序循环获取连接中的内容。就像上面的获取层级是2,0级的链内容接获取过了,仅仅用来获取1级中的链接,1级中的所有链接内容也获取过了,仅仅用来保存2级中的链接,等到真正获取内容的时候又会对上面的内容进行一次获取,而且上面的hash数组中的状态都没有用到。。。(有待优化)。

还有一个获取文章的正则,通过分析博客园中的文章内容,发现文章标题、正文部分基本都可以很规则的获取到。标题,标题html代码的形式都是下图的那种格式,可以很轻松的用下面的正则匹配到:

#]*?>(.*?)#is

正文,正文部分是可以通过正则表达式的高级特性平衡组,很容易获取到的,但弄了半天发现php好像对平衡组支持的不是很好,所以放弃额平衡组,在html源码中发现通过下面的正则也可以很容易匹配到文章正文的内容,每篇文章基本都有下图中的内容:

#(

]*?>.*)

#is

正文开始:

正文结束:

静态网页的爬取思路_python爬取网页内容_excel爬取网页数据

«»

博客的发布时间也是可以获取到的,但有些文章在获取发布时间的时候可能会找不到,这个就不列在这里了,有了这些东西就可以爬取内容了。

开始爬取»

开始爬取内容了,最初我设置的爬取深度是2级,初始页面是博客园首页,发现爬取不了多少内容,后来发现博客园首页有个页码导航。

就试图拼接成页码格式#p2,循环200次,以每页为起始页面,深度为2去抓取。但我高兴的太早了,开了几个进程跑了好久程序,抓了几十万条,后来发现完全在重复,都是从第一页中抓取的,因为博客园首页点击导航的时候(除了第一页),都是ajax请求获取到的。看来博客园还是考虑到这个问题,因为大多数人都是只打开首页,不会去点击后面的内容(我可能偶尔会去点击下一页),所以为了在防止初级抓取者去抓取和性能发面做权衡,将第一页设置为静态网页的方式,缓存有效期是几分钟(或者是根据跟新频率,当更新多少篇的时候去更新缓存,或者两者的结合),这也是为什么有时候发布的文章,过一会儿才会显示出来的原因(我猜的^_^)。

难道不能一次性抓取很多内容吗?后来我发现这个地方使用的全部是静态网页。

从"找找看"这个地方获取到的内容都是静态的,包括最下面的导航链接中的所有页面都是静态的,而且,这个搜索右边还有筛选条件,可以更好的提高抓取的质量。好了有了这个入口,就可以获取到好多高质量的文章了,下面是循环抓取100页的代码:

for($i=1;$();

die();

foreach($urls as$key=>$value){

$cnblogs->grap($value);

excel爬取网页数据_静态网页的爬取思路_python爬取网页内容

$cnblogs->save();

}

}

至此,就可以去抓去自己喜欢的东西了,抓取速度不是很快,我在一台普通pc上面开了10个进程,抓了好几个小时,才获取到了40多万条数据,好了看看抓取到的内容稍微优化之后的显示效果,这里面加上了博客园的基础css代码,可以看出效果:

抓取到的内容稍作修改:

原始内容:

再看下文件目录结构,也是用上篇的自制目录生成工具生成的:

«»

今天又想到,抓取的时候用队列应该比较合适,新抓取的链接放在队头,从队尾获取链接的内容并匹配生成新的链接插入队头,这样思路应该更清晰,更简单。

效果还是很不错的,这里再猜下推酷这种专门爬取的网站的工作方式,一个常驻进程,隔一段时间去获取一次内容(比如说首页),如果有新鲜的内容就采集入库,没有的话就放弃这次获取的内容,等待下次获取,当时间很小的时候就可以一篇不漏的抓取的”新鲜“的内容。

这是github地址:github——myBlogs