牛骨文教育服务平台(让学习变的简单)
博文笔记

一个简单的开源PHP爬虫框架『Phpfetcher』

创建时间:2015-01-25 投稿人: 浏览次数:1262
转载请注明: 吹水小镇 | reetsee.com
原文链接地址: http://blog.reetsee.com/archives/366
好久不见了!我终于又写一篇日志了,本来有很多流水帐想发但是感觉没营养,就作罢了。

今天我主要分享一个简单的PHP爬虫框架,名字叫:Phpfetcher

项目的地址是:https://github.com/fanfank/phpfetcher

这个框架的作者是:reetsee.xu,即吹水。

把整个项目下载下来后,在Linux下的终端直接执行demo文件夹下的single_page.php即可看到效果。不过在执行demo文件前,先设置一下你的终端编码为UTF-8以免显示乱码:

1 export LANG=en_US.UTF-8

————————————————————————————————

0 背景

背景是这样的目前吹水新闻(http://news.reetsee.com)下的内容全部由Python的爬虫抓取,使用的框架是Python的Scrapy,而吹水新闻目前是运行在BAE(百度应用引擎)下的,每个月还需要交钱。目前我的想法是把吹水新闻完全迁移到目前这台阿里云主机上,并且原本的新闻我每天都手动执行一次脚本来抓取再更新到网站,等迁移到这里后就能直接使用Crontab定时脚本自动更新新闻了!

最近工作都在用PHP,开发网站的新页面要PHP,直接读写数据库也能用PHP,那么就直接用PHP重构新闻网站好了。

准备开干的时候却发现没找到一个好的PHP爬虫框架(可能是我没仔细找),于是就打算自己写一个,因此就有了这个Phpfetcher。

名字起得略好……但是代码写得略搓……不管怎么样,目前基本可以用,而且应该能满足不少简单的需求,下面就是使用示例。

 1 基本概念

在Phpfetcher中有四个主要的对象,依次是:Dom,Page,Crawler,Manager。

  • Dom对象用来解析html,能够访问html里的dom;
  • Page对象对应到一个具体的html页面,能够取得整个网页的内容,Page对象中有一个Dom对象的成员;
  • Crawler对象可以理解为就是爬虫对象,用来设置要爬取页面的规则;
  • Manager对象原本是用来管理Crawler对象的,以后或许能用来在多进程环境下使用,但目前没有实现,所以暂时没有用;

大致概念就是这样了,实际使用主要是操作Crawler对象。在Phpfetcher中,你可以实现自己的Dom,Page和Crawler,只要符合基类的要求即可。

要说明的是Phpfetcher的默认Page对象中的Dom对象使用的是simple_html_dom,没有使用PHP提供的DOMDocument类,因为我发现DOMDocument对HTML格式的内容兼容性比较差,有时网页中混入其它内容时可能解析不出dom。

下面这张是图是Phpfetcher的目录结构:

phpfetcher_目录结构

你可以根据自己的需要定制想要的Crawler,Page,Dom类,默认情况下我提供了Crawler的默认类是Phpfetcher_Crawler_Default,Page的默认类是Phpfetcher_Page_Default,Dom的默认类是Phpfetcher_Dom_SimpleHtmlDom。类名和它们所在的路径有对应关系。要注意的是,在使用默认的Page对象时需要PHP的curl库,使用默认的Crawler对象时需要使用PHP的mb_string库,没有的需要装一下。

为了便于理解,我画了几张图,第一张是Phpfetcher的三个主要对象之间的关系:

phpfetcher_类结构

图里表示的是Crawler里面有Page的对象,Page里面有Dom的对象。

在使用Phpfetcher时,最重要的是完成下图中两个绿色矩形框要求的事情:

使用phpfetcher

 

即你要写一个类继承Phpfetcher提供的Crawler类,然后在你自己的类中实现一个名为handlePage($page)的函数。其中$page参数是一个Phpfetcher的Page类对象。

最后这里给出一个基本的流程图:

phpfetcher_工作流程图

 

上面说的东西有点虚,那还是直接看实例吧!

 

2 简单例子

****** 实例1:single_page.php ******

例如我们要抓取这个网站的内容:http://news.qq.com/a/20140927/026557.htm

里面有很多超链接,有标题,有新闻详细内容,或者其它我们关心的内容。

先看一下下面的例子:

01 <?php
02 require_once("phpfetcher.php");
03 class mycrawler extends Phpfetcher_Crawler_Default {
04     public function handlePage($page) {
05         //打印处当前页面的title
06         $res $page->sel("//title");
07         for ($i = 0; $i count($res); ++$i) {
08             echo $res
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。