ctnet 发表于 2009 年 1 月 19 日 00:10:28

[转]snoopy——PHP版的网络客户端

magpierss中就用到了snoopy,这让我有点兴趣去研究下这个咚咚。再SF上,找到了这个源代码。居然就是一个类,但不要笑看哦,功能可是很强大的。

   官方的简介,我翻译了下(汗。。。最近老是充当翻译的角色)


    snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
    下面是它的一些特征:
1、方便抓取网页的内容
2、方便抓取网页的文字(去掉HTML代码)
3、方便抓取网页的链接
4、支持代理主机
5、支持基本的用户/密码认证模式
6、支持自定义用户agent,referer,cookies和header内容
7、支持浏览器转向,并能控制转向深度
8、能把网页中的链接扩展成高质量的url(默认)
9、方便提交数据并且获取返回值
10、支持跟踪HTML框架(v0.92增加)
11、支持再转向的时候传递cookies



下面是简单的例子,比如说我们抓取我的blog的文字

<?
include "Snoopy.class.php";
$snoopy = new Snoopy;
$snoopy->fetchtext("http://www.phpobject.net/blog");
echo $snoopy->results;
?>

^_^,不错把,在比如抓取链接

<?
include "Snoopy.class.php";
$snoopy = new Snoopy;
$snoopy->fetchlinks("http://www.phpobject.net/blog");
print_r($snoopy->results);
?>

嘿嘿,效果不错把,而且全部都是我们需要的url,而没有那种/blog/read.php/85.htm那种东西。

另外提交数据那些稍后测试。。。

ctnet 发表于 2009 年 1 月 19 日 00:12:32

使用snoopy提交数据实现登陆
大 | 中 | 小   
    上一篇文章,我简单的介绍了snoopy及基本的应用,这里我们具体讲讲如何使用snoopy来模拟登陆。
    模拟登陆可以用curl或者socket来实现,当curl需要服务器相应的启用curl module,自己socket实现相对比较麻烦,使用snoopy就简单了很多啦。

    在这里,我们使用喜悦国际村做为例子。(^_^,纯属研究)

    首先,我们要获取到登陆需要发送什么字段,目标地址是什么。这里我们使用snoopy的fetchform来实现。

<?
include "Snoopy.class.php";
$snoopy = new Snoopy;
$snoopy->fetchform("http://www.phpx.com/happy/logging.php?action=login");
print $snoopy->results;
?>

    当然你也可以直接查看http://www.phpx.com/happy/logging.php?action=login的源代码来实现,不过这样更加方便把。这里,我们获取到目标和提交的数据,下一步就可以实现模拟登陆了。代码如下:

<?
include "Snoopy.class.php";
$snoopy = new Snoopy;
$submit_url = "http://www.phpx.com/happy/logging.php?action=login";
   
    $submit_vars["loginmode"] = "normal";
    $submit_vars["styleid"] = "1";
    $submit_vars["cookietime"] = "315360000";
    $submit_vars["loginfield"] = "username";
    $submit_vars["username"] = "********"; //你的用户名
    $submit_vars["password"] = "*******";//你的密码
    $submit_vars["questionid"] = "0";
    $submit_vars["answer"] = "";   
    $submit_vars["loginsubmit"] = "提 &nbsp; ; 交";   
    $snoopy->submit($submit_url,$submit_vars);
    print $snoopy->results;

?>


   ^_^,是不是显示你已经登陆了?使用snoopy就是这么简单!

ctnet 发表于 2009 年 1 月 19 日 00:29:58

snoopy 应用(php采集利器一)
Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。
下载snoopy

Snoopy的一些特点:

1抓取网页的内容 fetch
2 抓取网页的文本内容 (去除HTML标签) fetchtext
3抓取网页的链接,表单 fetchlinks fetchform
4 支持代理主机
5支持基本的用户名/密码验证
6 支持设置 user_agent, referer(来路), cookies 和 header content(头文件)
7支持浏览器重定向,并能控制重定向深度
8能把网页中的链接扩展成高质量的url(默认)
9提交数据并且获取返回值
10 支持跟踪HTML框架
11支持重定向的时候传递cookies
要求php4以上就可以了 由于本身是php一个类 无需扩支持 服务器不支持curl时候的最好选择,

类方法:

fetch($URI)
———–

这是为了抓取网页的内容而使用的方法。
$URI参数是被抓取网页的URL地址。
抓取的结果被存储在 $this->results 中。
如果你正在抓取的是一个框架,Snoopy将会将每个框架追踪后存入数组中,然后存入 $this->results。

fetchtext($URI)
—————

本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中的文字内容。

fetchform($URI)
—————

本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中表单内容(form)。

fetchlinks($URI)
—————-

本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

submit($URI,$formvars)
———————-

本方法向$URL指定的链接地址发送确认表单。$formvars是一个存储表单参数的数组。

submittext($URI,$formvars)
————————–

本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回登陆后网页中的文字内容。

submitlinks($URI)
—————-

本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

类属性: (缺省值在括号里)

$host 连接的主机
$port 连接的端口
$proxy_host 使用的代理主机,如果有的话
$proxy_port 使用的代理主机端口,如果有的话
$agent 用户代理伪装 (Snoopy v0.1)
$referer 来路信息,如果有的话
$cookies cookies, 如果有的话
$rawheaders 其他的头信息, 如果有的话
$maxredirs 最大重定向次数, 0=不允许 (5)
$offsiteok whether or not to allow redirects off-site. (true)
$expandlinks 是否将链接都补全为完整地址 (true)
$user 认证用户名, 如果有的话
$pass 认证用户名, 如果有的话
$accept http 接受类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
$error 哪里报错, 如果有的话
$response_code 从服务器返回的响应代码
$headers 从服务器返回的头信息
$maxlength 最长返回数据长度
$read_timeout 读取操作超时 (要求 PHP 4 Beta 4+)
设置为0为没有超时
$timed_out 如果一次读取操作超时了,本属性返回 true (要求 PHP 4 Beta 4+)
$maxframes 允许追踪的框架最大数量
$status 抓取的http的状态
$temp_dir 网页服务器能够写入的临时文件目录 (/tmp)
$curl_path cURL binary 的目录, 如果没有cURL binary就设置为 false

以下是demo

include "Snoopy.class.php";
    $snoopy = new Snoopy;

    $snoopy->proxy_host = "www.taoav.com";
    $snoopy->proxy_port = "8080";
   
    $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
    $snoopy->referer = "http://www.taoav.com/";
   
    $snoopy->cookies["SessionID"] = 238472834723489l;
    $snoopy->cookies["favoriteColor"] = "RED";
   
    $snoopy->rawheaders["Pragma"] = "no-cache";
   
    $snoopy->maxredirs = 2;
    $snoopy->offsiteok = false;
    $snoopy->expandlinks = false;
   
    $snoopy->user = "joe";
    $snoopy->pass = "bloe";
   
    if($snoopy->fetchtext("http://www.taoav.com"))
    {
         echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n";
    }
    else
      echo "error fetching document: ".$snoopy->error."\n";

1条评论 &raquo;

ctnet 发表于 2009 年 1 月 19 日 00:31:28

snoopy 实例(php采集利器二)
上一篇介绍了snoopy,下面来说说snoopy可以做什么

1获取指定url内容

<?
$url = "http://www.taoav.com";
include("snoopy.php");
$snoopy = new Snoopy;
$snoopy->fetch($url); //获取所有内容
echo $snoopy->results; //显示结果
//可选以下
$snoopy->fetchtext //获取文本内容(去掉html代码)
$snoopy->fetchlinks //获取链接
$snoopy->fetchform//获取表单
?>

2 表单提交

<?php
$formvars["username"] = "admin";
$formvars["pwd"] = "admin";

$action = "http://www.taoav.com";//表单提交地址
$snoopy->submit($action,$formvars);//$formvars为提交的数组
echo $snoopy->results; //获取表单提交后的 返回的结果
//可选以下
$snoopy->submittext; //提交后只返回 去除html的 文本
$snoopy->submitlinks;//提交后只返回 链接
?>

既然已经提交的表单 那就可以做很多事情 接下来我们来伪装ip,伪装浏览器
3 伪装

<?php
$formvars["username"] = "admin";
$formvars["pwd"] = "admin";
$action = "http://www.taoav.com";
include "snoopy.php";
$snoopy = new Snoopy;
$snoopy->cookies["PHPSESSID"] = 'fc106b1918bd522cc863f36890e6fff7'; //伪装sessionid
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; //伪装浏览器
$snoopy->referer = "http://www.only4.cn"; //伪装来源页地址 http_referer
$snoopy->rawheaders["Pragma"] = "no-cache"; //cache 的http头信息
$snoopy->rawheaders["X_FORWARDED_FOR"] = "127.0.0.101"; //伪装ip
$snoopy->submit($action,$formvars);
echo $snoopy->results;
?>

原来我们可以伪装session 伪装浏览器 ,伪装ip, haha 可以做很多事情了。
例如 带验证码,验证ip 投票, 可以不停的投。
ps:这里伪装ip ,其实是伪装http头, 所以一般的通过 REMOTE_ADDR 获取的ip是伪装不了,
反而那些通过http头来获取ip的(可以防止代理的那种) 就可以自己来制造ip。
关于如何验证码 ,简单说下:
首先用普通的浏览器, 查看页面 , 找到验证码所对应的sessionid,
同时记下sessionid和验证码值,
接下来就用snoopy去伪造 。
原理:由于是同一个sessionid 所以取得的验证码和第一次输入的是一样的。

4 有时我们可能需要伪造更多的东西,snoopy完全为我们想到了

<?php
$snoopy->proxy_host = "www.only4.cn";
$snoopy->proxy_port = "8080"; //使用代理

$snoopy->maxredirs = 2; //重定向次数

$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
// 例如链接为 /images/taoav.gif 可改为它的全链接 http://www.taoav.com/images/taoav.gif

$snoopy->maxframes = 5 //允许的最大框架数
//注意抓取框架的时候 $snoopy->results 返回的是一个数组

$snoopy->error //返回报错信息
?>

下一篇 我们来看看强大的curl 欢迎来我的blog www.only4.cn

ctnet 发表于 2009 年 1 月 19 日 00:34:03

snoopy——php版的web客户端
admin |编程开发 |    |发表评论   
简单的说,snoopy是一个用以模拟浏览器功能的php类,它可以模拟访问,提交表单到你需要登录的web服务器端,同时提供了筛选信息的功能,让你可以根据需要取得自己想要的信息。
官网http://sourceforge.net/projects/snoopy
这是一个很好用的php类,使用方法很简单。具体如下:
1:获取页面的文本信息

<?php
require_once(”snoopy.class.php”); //包含snoopy类
$snoopy = new Snoopy;
$snoopy->fetchtext(”http://pp.qigaa.cn/index.php”);
print $snoopy->results; //打印出结果
?>

2.获得页面的链接信息

<?php
require_once(”snoopy.class.php”);
$snoopy = new Snoopy;
$snoopy->fetchtlinks(”http://pp.qigaa.cn/index.php”);
print_r($snoopy->results); //链接信息为一个数组
?>

3.获取表单信息

<?php
require_once(”snoopy.class.php”);
$snoopy = new Snoopy;
$snoopy->fetchform(”http://www.altavista.com”);
print $snoopy->results;
?>

4.模拟表单提交

<?php
require_once(”snoopy.class.php”);
$snoopy = new Snoopy;
$submit_url = “http://lnk.ispi.net/texis/scripts/msearch/netsearch.html”;
$submit_vars["q"] = “amiga”;
$submit_vars["submit"] = “Search!”;
$submit_vars["searchhost"] = “Altavista”;

$snoopy->submit($submit_url,$submit_vars);
print $snoopy->results;
?>

5.简单的功能就是这些。如果要更深入的研究,还有很多参数可供调节和调用,可以满足不同的使用需求。具体参数及相关的解释如下:
$host 要连接到的web服务器
$port 要连接的端口
$proxy_host the proxy host to use, if any
$proxy_port the proxy port to use, if any
$agent 模拟的客户端
$referer referer information to pass, if any
$cookies cookies to pass if any
$rawheaders other header info to pass, if any
$maxredirs maximum redirects to allow. 0=none allowed. (5)
$offsiteok whether or not to allow redirects off-site. (true)
$expandlinks whether or not to expand links to fully qualified URLs (true)
$user authentication username, if any
$pass authentication password, if any
$accept http accept types (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
$error where errors are sent, if any
$response_code responde code returned from server
$headers headers returned from server
$maxlength max return data length
$read_timeout timeout on read operations (要求 PHP 4 Beta 4+)
set to 0 to disallow timeouts
$timed_out true if a read operation timed out (要求 PHP 4 Beta 4+)
$maxframes number of frames we will follow
$status http status of fetch
$temp_dir temp directory that the webserver can write to. (/tmp)
$curl_path system path to cURL binary, set to false if none
等等如上。英文表达币翻译成中文更为贴切。在此不做翻译,如读者有问题,可致信liuxingdeyanmu@163.com做进一步探讨交流。
一个更复杂的使用例子如下,该例子的功能为使用用户名和密码取得页面信息,打印出服务器发送的头信息和发送到客户端的文本内容信息:

<?php
include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->user = “joe”;
$snoopy->pass = “bloe”;

if($snoopy->fetch(”http://www.slashdot.org/”)) {
echo “response code: “.$snoopy->response_code.”<br>\n”;
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<br>\n”;

echo “<pre>”.htmlspecialchars($snoopy->results).”</pre><br>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”<br>\n”;

长天 发表于 2009 年 1 月 19 日 01:32:28

早和套套在一年多前就用了

不过这个类有bug,我做了一个修正版本,不错

iewnil 发表于 2009 年 1 月 19 日 04:23:48

很明显 发表于 2009 年 1 月 19 日 08:45:50

呵呵,长天的VD就是这个类

y 发表于 2009 年 1 月 19 日 14:57:48

其实我想说LZ火星的。。。。01年出的PHP4开发手册里有这个类的详细介绍。。。

iewnil 发表于 2009 年 1 月 19 日 16:37:06

很明显,楼主只是纯粹灌水,激发潜水员上来。
页: [1] 2
查看完整版本: [转]snoopy——PHP版的网络客户端