如何使用Snoopy获取https页面

使用Snoopy来获取https页面需要用到curl,您需要先检查一下服务器是否安装curl。 Snoopy默认的curl路径是 /usr/local/bin/curl 。在服务器上运行 which curl 可以找到curl 的安装路径,如果他和默认的不一样,您需要设置 $snoopy->curl_path 变量为curl的路径, 代码如下:

include "Snoopy.class.php";
$snoopy = new Snoopy;
$snoopy->curl_path="/usr/bin/curl";

(End)

Snoopy网络客户端类使用文档

Snoopy方法

  • fetch($URI) 获取一个网页HTML源代码,内容保存在$this->results中, 如果目标网页是一个frames(框架)页面,$this->results以数组形式保存每一个页面

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->fetch("http://www.zzphp.net/");
    var_dump($snoopy->results);
    
  • fetchtext($URI) 获取一个网页内容,不包含HTML代码和其他无关内容,只是文字内容

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->fetchtext("http://www.zzphp.net/");
    var_dump($snoopy->results);
    
  • fetchform($URI) 获取一个网页内的表单内容,只包含页面中的表单(form)代码

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->fetchform("http://www.zzphp.net/");
    var_dump($snoopy->results);
    
  • fetchlinks($URI) 获取一个网页内所有的链接,这些链接都是完整的带有域名的链接, 遇到不完整或者是相对路径的链接,Snoopy会自动补全链接地址

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->fetchlinks("http://www.zzphp.net/");
    var_dump($snoopy->results);
    
  • submit($URI,$formvars,$formfiles) 提交一个表单到指定的$URI,$formvars变量是需要提交的数据, 他需要一个数组,$formfiles和$formvars类是,是个数组,但是值需要是一个文件地址, 例如:$formfiles["var"] = “/dir/filename.ext”;

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    $submit_url = "http://www.zzphp.net/examples/snoopy_submit.php"; 
    $submit_vars["a"] = "a_value";
    $submit_vars["b"] = "b_value"; 
    $snoopy->submit($submit_url,$submit_vars);
    var_dump($snoopy->results);
    
  • submittext($URI,$formvars,$formfiles) 提交一个表单到指定的$URI,和submit方法类似, 不同的只是他返回文本内容,不包含HTML代码和其他无关数据

  • submitlinks($URI,$formvars,$formfiles) 这个方法和submit方法类似,但是返回的值是所有链接, 这点和fetchlinks方法类是

类变量 (括号中是默认值)

  • $host
    链接到的主机地址

  • $port
    链接到的主机的端口

  • $proxy_host
    使用的代理主机地址,如果有的话

  • $proxy_port
    使用的代理主机端口,如果有的话

  • $agent
    HTTP协议user-agent值,(Snoopy v0.1)

  • $referer
    来路信息,如果有的话

  • $cookies
    客户端cookies,如果有的话

  • $rawheaders
    其他的HTTP头信息

  • $maxredirs
    最大重定向次数。0=不允许重定向,默认值:(5)

  • $offsiteok
    是否允许重定向。(true)

  • $expandlinks
    是否将链接地址都自动补全为完整链接地址 (true)

  • $user
    认证中的用户名,如果有的话

  • $pass
    认证中的密码,如果有的话

  • $accept
    HTTP接受文件类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, /)

  • $error
    错误信息,如果有的话

  • $response_code
    服务器返回的HTTP状态码

  • $headers
    服务器返回的HTTP头信息

  • $maxlength
    从服务器返回数据的大小

  • $read_timeout
    读取数据的超时时间,设置为0禁用超时 (需要PHP 4以上版本)

  • $timed_out
    如果发生了读取数据超时的情况,此变量为真 (需要PHP 4以上版本)

  • $maxframes
    限制框架网页最大的框架层级

  • $status
    获取HTTP状态

  • $temp_dir
    保存获取网页内容的临时目录 (/tmp)

  • $curl_path
    cURL文件的系统地址,如故没有cURL设置为false

(End)

Snoopy模拟网页浏览器的PHP类

Snoopy是一个模拟网页浏览器的PHP类,他可以获取网页内容和发送表单。

  • 获取网页的内容
  • 获取网页的文字(去掉HTML代码)
  • 获取网页的链接
  • 支持代理
  • 支持基本的用户/密码认证模式
  • 支持自定义user_agent,referer,cookies和header内容
  • 支持浏览器转向,并能控制转向深度
  • 能把网页中的链接扩展成高质量的url(默认)
  • 提交表单数据并且获取返回值
  • 支持跟踪HTML框架(v0.92增加)
  • 支持跳转的时候传递cookies

Snoopy需要PHP PCRE扩展(Perl Compatible Regular Expressions),需要PHP 3.0.9以上版本,如果要支持read超时,需要PHP 4以上版本。Snoopy在PHP 3.0.12版本下面开发和测试。

虽然Snoopy最后一个版本1.2.4发布距离现在已经有4年之久(2008年10月发布),但是仍然不影响他的易用和强大。

下载地址:http://sourceforge.net/projects/snoopy/

Snoopy性能测试、速度测试

之前测试了curl, file_get_contents和fsockopen方法获取网页的速度,今天再测试下Snoopy,Snoopy底层还是使用fsockopen方法驱动的。按想这个测试结果应该不会比上次测试中的fsockopen要好,但结果却相反。

测试代码:

<?php
require 'Benchmark/Iterate.php';
include "Snoopy.class.php";

function snoopy_test(){
    $snoopy = new Snoopy;

    $snoopy->fetch("http://www.google.com.hk/");
    return $snoopy->results;
}

$benchmark = new Benchmark_Iterate();
$benchmark->run(10, 'snoopy_test');
$result = $benchmark->get();
var_dump($result);

测试结果:

array (size=12)
  1 => string '0.301730' (length=8)
  2 => string '0.242408' (length=8)
  3 => string '0.306462' (length=8)
  4 => string '0.242553' (length=8)
  5 => string '0.249154' (length=8)
  6 => string '0.316298' (length=8)
  7 => string '0.250106' (length=8)
  8 => string '0.248223' (length=8)
  9 => string '0.296550' (length=8)
  10 => string '0.240236' (length=8)
  'mean' => string '0.269372' (length=8)
  'iterations' => int 10

查看上次测试结果:curl, file_get_contents和fsockopen速度比较

为了测试结果有比较性,我又运行了上次的测试代码,结果和上面文章内的结果几乎一样。

(End)