Snoopy

OK,这里讲的不是卡通 Snoopy 了。是 PHP 一个类。它能用来模仿 web 浏览器的功能,它能完成获取网页内容和发送表单的任务。从它的官方网站可以了解到:

  1. 快速简便抓取网页的内容,文本(去掉了 Html 标签)和链接。
  2. 支持代理服务器,基本的用户/密码认证模式,内容。
  3. 支持浏览器重定向,并控制深度。
  4. 扩展获取的链接成带有域名的链接(默认)
  5. 能提交表单数据并获取结果
  6. 支持跟踪 HTML 框架(0.92 版本增加)
  7. 支持在重定向时传递 cookies(0.92 版本增加)

Snoopy 正确运行需要你的服务器的 PHP 版本在 4 以上,并且支持 PCRE(Perl Compatible Regular Expressions),基本的 LAMP 服务都支持。

它提供以下的接口或者方法:

URI) 这个方法是抓取网页的内容,URI 是要抓取网页的网址,抓取过来结果存储到 this->results。如果你抓取的是框架,这每个 frame 都会被抓取,结果会保存到一个数组中。

fetchtext($URI) 这个方法和 fetch() 是大致相同,只是它的结果是文本,除去 HTML 标签和其他无关信息。

fetchform($URI) 这个方法只返回抓取的网页上 form 元素。

fetchlinks($URI) 这个方法只返回抓取的网页上的链接,默认返回的链接都是含有域名的链接。

submit(URI,formvars) 这个方法提交一个表单到指定的 URI。formvars 是要传递的 form 变量数组。

submittext(URI,formvars) 这个方法和 submit() 基本一致,但是它返回的是文本,除去了 html 标签和其他无关数据。

submitlinks($URI) 这个方法返回的是链接。

在 WordPress 中,已经包含了这个类,并且我们前面提到的 MagpieRSS 这个 RSS 解析类中,也使用这个类去获取 RSS。最新版的 WordPress 2.5 就使用 Snoopy 来下载文件来更新插件,其中用到的 Snoopy 类的代码为:

代码语言:javascript
复制
function download_url( $url ) {
    if( ! $url )
        return false;
 
    $tmpfname = tempnam(get_temp_dir(), 'wpupdate'); //获取临时文件名
    if( ! $tmpfname )
        return false;
 
    $handle = fopen($tmpfname, 'w'); //以写的方式打开临时文件
    if( ! $handle )
        return false;
 
    require_once( ABSPATH . 'wp-includes/class-snoopy.php' ); //引入 Snoopy 类
    $snoopy = new Snoopy();    
    $snoopy->fetch($url); //抓取指定的网页
 
    fwrite($handle, $snoopy->results); //把抓取得内容写到 临时文件中
    fclose($handle);
 
    return $tmpfname;
}