`
varsoft
  • 浏览: 2508835 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[转] 贴Snoopy.class.php代码学习参考

阅读更多


Snoopy.class.php 是一个关于HTTP协议访问操作的类库,主要是使用在 MagpieRSS 中用于远程文件的抓取,我原来转载的一篇文章大致有简单的介绍这个东西,今天无聊,把代码帖出来,大家参考学习。

<?php

/*************************************************

Snoopy-thePHPnetclient
Author:MonteOhrt<monte@ispi.net>
Copyright(c):1999-2000ispi,allrightsreserved
Version:1.01

*Thislibraryisfreesoftware;youcanredistributeitand/or
*modifyitunderthetermsoftheGNULesserGeneralPublic
*LicenseaspublishedbytheFreeSoftwareFoundation;either
*version2.1oftheLicense,or(atyouroption)anylaterversion.
*
*Thislibraryisdistributedinthehopethatitwillbeuseful,
*butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof
*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.SeetheGNU
*LesserGeneralPublicLicenseformoredetails.
*
*YoushouldhavereceivedacopyoftheGNULesserGeneralPublic
*Licensealongwiththislibrary;ifnot,writetotheFreeSoftware
*Foundation,Inc.,59TemplePlace,Suite330,Boston,MA02111-1307USA

YoumaycontacttheauthorofSnoopybye-mailat:
monte@ispi.net

Or,writeto:
MonteOhrt
CTO,ispi
237S.70thsuite220
Lincoln,NE68510

ThelatestversionofSnoopycanbeobtainedfrom:
http://snoopy.sourceforge.net/

************************************************
*/

classSnoopy
{
/****Publicvariables****/

/*userdefinablevars*/

var$host="www.php.net";//hostnameweareconnectingto
var$port=80;//portweareconnectingto
var$proxy_host="";//proxyhosttouse
var$proxy_port="";//proxyporttouse
var$proxy_user="";//proxyusertouse
var$proxy_pass="";//proxypasswordtouse

var$agent="Snoopyv1.2.3";//agentwemasqueradeas
var$referer="";//refererinfotopass
var$cookies=array();//arrayofcookiestopass
//$cookies["username"]="joe";

var$rawheaders=array();//arrayofrawheaderstosend
//$rawheaders["Content-type"]="text/html";


var$maxredirs=5;//httpredirectiondepthmaximum.0=disallow
var$lastredirectaddr="";//containsaddressoflastredirectedaddress
var$offsiteok=true;//allowsredirectionoff-site
var$maxframes=0;//framecontentdepthmaximum.0=disallow
var$expandlinks=true;//expandlinkstofullyqualifiedURLs.
//thisonlyappliestofetchlinks()
//submitlinks(),andsubmittext()

var$passcookies=true;//passsetcookiesbackthroughredirects
//NOTE:thiscurrentlydoesnotrespect
//dates,domainsorpaths.


var$user="";//userforhttpauthentication
var$pass="";//passwordforhttpauthentication

//httpaccepttypes

var$accept="image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,*/*";

var$results="";//wherethecontentisput

var$error="";//errormessagessenthere
var$response_code="";//responsecodereturnedfromserver
var$headers=array();//headersreturnedfromserversenthere
var$maxlength=500000;//maxreturndatalength(body)
var$read_timeout=0;//timeoutonreadoperations,inseconds
//supportedonlysincePHP4Beta4
//setto0todisallowtimeouts

var$timed_out=false;//ifareadoperationtimedout
var$status=0;//httprequeststatus

var$temp_dir="/tmp";//temporarydirectorythatthewebserver
//haspermissiontowriteto.
//underWindows,thisshouldbeC: emp


var$curl_path="/usr/local/bin/curl";
//SnoopywillusecURLforfetching
//SSLcontentifafullsystempathto
//thecURLbinaryissuppliedhere.
//settofalseifyoudonothave
//cURLinstalled.Seehttp://curl.haxx.se
//fordetailsoninstallingcURL.
//Snoopydoes*not*usethecURL
//libraryfunctionsbuiltintophp,
//asthesefunctionsarenotstable
//asofthisSnoopyrelease.


/****Privatevariables****/

var$_maxlinelen=4096;//maxlinelength(headers)

var$_httpmethod="GET";//defaulthttprequestmethod
var$_httpversion="HTTP/1.0";//defaulthttprequestversion
var$_submit_method="POST";//defaultsubmitmethod
var$_submit_type="application/x-www-form-urlencoded";//defaultsubmittype
var$_mime_boundary="";//MIMEboundaryformultipart/form-datasubmittype
var$_redirectaddr=false;//willbesetifpagefetchedisaredirect
var$_redirectdepth=0;//incrementsonanhttpredirect
var$_frameurls=array();//framesrcurls
var$_framedepth=0;//incrementsonframedepth

var$_isproxy=false;//setifusingaproxyserver
var$_fp_timeout=30;//timeoutforsocketconnection

/*======================================================================*
Function:fetch
Purpose:fetchthecontentsofawebpage
(andpossiblyotherprotocolsinthe
futurelikeftp,nntp,gopher,etc.)
Input:$URIthelocationofthepagetofetch
Output:$this->resultstheoutputtextfromthefetch
*======================================================================
*/

functionfetch($URI)
{

//preg_match("|^([^:]+)://([^:/]+)(:[d]+)*(.*)|",$URI,$URI_PARTS);
$URI_PARTS=parse_url($URI);
if(!empty($URI_PARTS["user"]))
$this->user=$URI_PARTS["user"];
if(!empty($URI_PARTS["pass"]))
$this->pass=$URI_PARTS["pass"];
if(empty($URI_PARTS["query"]))
$URI_PARTS["query"]='';
if(empty($URI_PARTS["path"]))
$URI_PARTS["path"]='';

switch(strtolower($URI_PARTS["scheme"]))
{
case"http":
$this->host=$URI_PARTS["host"];
if(!empty($URI_PARTS["port"]))
$this->port=$URI_PARTS["port"];
if($this->_connect($fp))
{
if($this->_isproxy)
{
//usingproxy,sendentireURI
$this->_httprequest($URI,$fp,$URI,$this->_httpmethod);
}
else
{
$path=$URI_PARTS["path"].($URI_PARTS["query"]?"?".$URI_PARTS["query"]:"");
//noproxy,sendonlythepath
$this->_httprequest($path,$fp,$URI,$this->_httpmethod);
}

$this->_disconnect($fp);

if($this->_redirectaddr)
{
/*urlwasredirected,checkifwe'vehitthemaxdepth*/
if($this->maxredirs>$this->_redirectdepth)
{
//onlyfollowredirectifit'sonthissite,oroffsiteokistrue
if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr)||$this->offsiteok)
{
/*followtheredirect*/
$this->_redirectdepth++;
$this->lastredirectaddr=$this->_redirectaddr;
$this->fetch($this->_redirectaddr);
}
}
}

if($this->_framedepth<$this->maxframes&&count($this->_frameurls)>0)
{
$frameurls=$this->_frameurls;
$this->_frameurls=array();

while(list(,$frameurl)=each($frameurls))
{
if($this->_framedepth<$this->maxframes)
{
$this->fetch($frameurl);
$this->_framedepth++;
}
else
break;
}
}
}
else
{
returnfalse;
}
returntrue;
break;
case"https":
if(!$this->curl_path)
returnfalse;
if(function_exists("is_executable"))
if(!is_executable($this->curl_path))
returnfalse;
$this->host=$URI_PARTS["host"];
if(!empty($URI_PARTS["port"]))
$this->port=$URI_PARTS["port"];
if($this->_isproxy)
{
//usingproxy,sendentireURI
$this->_httpsrequest($URI,$URI,$this->_httpmethod);
}
else
{
$path=$URI_PARTS["path"].($URI_PARTS["query"]?"?".$URI_PARTS["query"]:"");
//noproxy,sendonlythepath
$this->_httpsrequest($path,$URI,$this->_httpmethod);
}

if($this->_redirectaddr)
{
/*urlwasredirected,checkifwe'vehitthemaxdepth*/
if($this->maxredirs>$this->_redirectdepth)
{
//onlyfollowredirectifit'sonthissite,oroffsiteokistrue
if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr)||$this->offsiteok)
{
/*followtheredirect*/
$this->_redirectdepth++;
$this->lastredirectaddr=$this->_redirectaddr;
$this->fetch($this->_redirectaddr);
}
}
}

if($this->_framedepth<$this->maxframes&&count($this->_frameurls)>0)
{
$frameurls=$this->_frameurls;
$this->_frameurls=array();

while(list(,$frameurl)=each($frameurls))
{
if($this->_framedepth<$this->maxframes)
{
$this->fetch($frameurl);
$this->_framedepth++;
}
else
break;
}
}
returntrue;
break;
default:
//notavalidprotocol
$this->error='Invalidprotocol"'.$URI_PARTS["scheme"].'" ';
returnfalse;
break;
}
returntrue;
}

/*======================================================================*
Function:submit
Purpose:submitanhttpform
Input:$URIthelocationtopostthedata
$formvarstheformvarstouse.
format:$formvars["var"]="val";
$formfilesanarrayoffilestosubmit
format:$formfiles["var"]="/dir/filename.ext";
Output:$this->resultsthetextoutputfromthepost
*======================================================================
*/

functionsubmit($URI,$formvars="",$formfiles="")
{
unset($postdata);

$postdata=$this->_prepare_post_body($formvars,$formfiles);

$URI_PARTS=parse_url($URI);
if(!empty($URI_PARTS["user"]))
$this->user=$URI_PARTS["user"];
if(!empty($URI_PARTS["pass"]))
$this->pass=$URI_PARTS["pass"];
if(empty($URI_PARTS["query"]))
$URI_PARTS["query"]='';
if(empty($URI_PARTS["path"]))
$URI_PARTS["path"]='';

switch(strtolower($URI_PARTS["scheme"]))
{
case"http":
$this->host=$URI_PARTS["host"];
if(!empty($URI_PARTS["port"]))
$this->port=$URI_PARTS["port"];
if($this->_connect($fp))
{
if($this->_isproxy)
{
//usingproxy,sendentireURI
$this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);
}
else
{
$path=$URI_PARTS["path"].($URI_PARTS["query"]?"?".$URI_PARTS["query"]:"");
//noproxy,sendonlythepath<b
分享到:
评论

相关推荐

    Snoopy.class.php类及中文说明

    Snoopy.class.php 是一个广泛使用的PHP类库,主要用于实现HTTP客户端的功能,它允许开发者模拟浏览器行为,发送HTTP请求,并获取服务器的响应。这个库在处理网页抓取、数据采集和自动化测试等任务时非常有用。 ...

    Snoopy.class.rar_Snoopy.class.php

    标题中的"Snoopy.class.rar_Snoopy.class.php"暗示了这是一个与PHP相关的压缩包,包含了一个名为"Snoopy.class.php"的文件。Snoopy在PHP世界中通常指的是一个网络爬虫类库,用于模拟HTTP请求,抓取网页数据。这个...

    2014最新Snoopy.class.php

    Snoopy 是一个非常强大的PHP类,下面是详细介绍Snoopy.class.php源文件的内容。希望对大家有所帮助 Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。 Snoopy的一些特点: 1抓取网页的内容 ...

    Snoopy.class.php

    $snoopyx = new Snoopy ; $snoopyx-&gt;fetch($furl) ; if($snoopyx-&gt;results !="") { $handle = fopen($filename, 'w') ; fwrite($handle, $snoopyx-&gt;results) ; //把抓取得内容写到 临时文件中 fclose($...

    Snoopy.class.php——登陆采集利器

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。使用Snoopy来模拟登陆,然后采集登陆后的页面非常管用! Snoopy的特点: 1、抓取网页的内容 fetch 2、抓取网页的文本内容 (去除HTML标签) ...

    94.纯色史努比Snoopy.docx

    94.纯色史努比Snoopy.docx

    93.彩色史努比Snoopy.docx

    93.彩色史努比Snoopy.docx

    snoopy.rar_The Client

    标题"Snoopy.rar_The Client"暗示我们关注的是一个与客户端相关的PHP库,可能是用于网络通信的。描述中提到"Snoopy"是一个PHP的网络客户端,它利用了cURL库来实现远程调用功能。cURL是PHP中广泛使用的库,用于在...

    Snoopy-1.2.4

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl Compatible Regular Expressions),基本的LAMP服务都支持。

    php 下载远程图片

    本篇文章将详细讲解如何使用PHP实现这个功能,并着重介绍Snoopy.class.php类的使用。 首先,让我们了解基本的PHP下载远程文件的方法。通过`file_get_contents`函数,我们可以直接读取并保存远程URL的内容。例如,...

    PHP实例开发源码—snoopy 强大的PHP采集类.zip

    1. **安装**:通常,只需将Snoopy类的源代码文件(如snoopy.class.php)包含到项目中即可使用。 2. **初始化**:创建Snoopy对象,然后设置任何必要的配置,如代理服务器、超时时间等。 3. **发起请求**:调用fetch()...

    网页采集类Snoopy类及中文说明.rar

    Snoopy.class.php,实现网页下载, 网页采集类,Snoopy的一些功能特点: 抓取网页的内容 fetch() 抓取网页的文本内容 (去除HTML标签) fetchtext() 抓取网页的链接,表单 fetchlinks() fetchform() 支持代理...

    Snoopy:一个用来模拟浏览器的一些简单功能的php类库

    Snoopy是一个用来模拟浏览器的一些简单功能的php类,可以获取网页内容,发送表单等操作,Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl Compatible Regular Expressions),基本的LAMP服务都支持,由于...

    php snoopy 模拟表单提交 数据抓取

    在提供的压缩包文件中,snoopy.class.php是Snoopy类的实现文件,包含了所有必要的方法和属性。 1. **初始化Snoopy对象** 在使用Snoopy之前,首先需要实例化一个Snoopy对象: ```php require_once 'snoopy.class....

    PHP采集类snoopy详细介绍(snoopy使用教程)

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单,可以用来开发一些采集程序和小偷程序,本文章详细介绍snoopy的使用教程。 Snoopy的一些特点: 抓取网页的内容 fetch 抓取网页的文本内容 ...

    HA-WPE.Pro0.9F-Snoopy.zip

    《网络封包编辑器WPE详解及其应用》 在信息技术高速发展的今天,网络封包编辑器作为网络安全与软件开发中的重要工具,起着至关重要的作用。本文将详细讲解一款名为WPE(Winsock Packet Editor)的专业工具,以及其...

    Snoopy:一个用来模拟浏览器的一些简单功能的php类库.zip

    Snoopy是一个用来模拟浏览器的一些简单功能的php类,可以获取网页内容,发送表单等操作,Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl Compatible ...需要的朋友可以参考下,方便大家学习php的代码。

    用snoopy抓取EMS验证码,远程模拟查询单号,取得查询结果

    在`Snoopy.class.php`文件中,包含了Snoopy类的所有功能,包括初始化、设置URL、发送请求、接收响应等功能。 在"ems.php"文件中,通常会包含使用Snoopy进行EMS网站请求的代码。首先,我们需要实例化Snoopy对象,...

Global site tag (gtag.js) - Google Analytics