`

PHP采集利器snoopy应用详解

 
阅读更多

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

一、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 读取操作超时 (requires PHP 4 Beta 4+)
设置为0为没有超时
$timed_out 如果一次读取操作超时了,本属性返回 true (requires 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.baidu.com“;
$snoopy->proxy_port = “8080″;

$snoopy->agent = “(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)”;
$snoopy->referer = “http://www.baidu.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.baidu.com“))
{
echo ” <PRE>”.htmlspecialchars($snoopy->results).” </PRE>/n”; <BR>
} <BR>
else <BR>
echo “error fetching document: “.$snoopy->error.”/n”;

snoopy采集phpchina示例
<?php
//采集phpchina
set_time_limit(0);
require_once(“Snoopy.class.php”);
$snoopy=new Snoopy();
//登陆论坛
$submit_url = “http://www.phpchina.com/bbs/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"] = “提 交”;
$snoopy->submit($submit_url,$submit_vars);
if ($snoopy->results)
{
//获取连接地址
$snoopy->fetchlinks(“http://www.phpchina.com/bbs“);
$url=array();
$url=$snoopy->results;
//print_r($url);
foreach ($url as $key=>$value)
{
//匹配http://www.phpchina.com/bbs/forumdisplay.php?fid=156&sid=VfcqTR地址即论坛板块地址
if (!preg_match(“/^(http:////www/.phpchina/.com//bbs//forumdisplay/.php/?fid=)[0-9]*&sid=[a-zA-Z]{6}/i”,$value))
{
unset($url[$key]);
}
}
//print_r($url);
//获取到板块数组$url,循环访问,此处获取第一个模块第一页的数据
$i=0;
foreach ($url as $key=>$value)
{
if ($i>=1)
{
//测试限制
break;
}
else
{
//访问该模块,提取帖子的连接地址,正式访问里需要提取帖子分页的数据,然后根据分页数据提取帖子数据
$snoopy=new Snoopy();
$snoopy->fetchlinks($value);
$tie=array();
$tie[$i]=$snoopy->results;
//print_r($tie);
//转换数组
foreach ($tie[$i] as $key=>$value)
{
//匹配http://www.phpchina.com/bbs/viewthread.php?tid=68127&amp;extra=page%3D1&amp;page=1&sid=iBLZfK
if (!preg_match(“/^(http:////www/.phpchina/.com//bbs//viewthread/.php/?tid=)[0-9]*&amp;extra=page/%3D1&amp;page=[0-9]*&sid=[a-zA-Z]{6}/i”,$value))
{
unset($tie[$i][$key]);
}
}
//print_r($tie[$i]);
//归类数组,将同一个帖子不同页面的内容放一个数组里
$left=”;//连接左边公用地址
$j=0;
$page=array();
foreach ($tie[$i] as $key=>$value)
{
$left=substr($value,0,52);
$m=0;
foreach ($tie[$i] as $pkey=>$pvalue)
{
//重组数组
if (substr($pvalue,0,52)==$left)
{
$page[$j][$m]=$pvalue;
$m++;
}
}
$j++;
}
//去除重复项开始
//$page=array_unique($page);只能用于一维数组
$paget[0]=$page[0];
$nums=count($page);
for ($n=1;$n <$nums;$n++)
{
$paget[$n]=array_diff($page[$n],$page[$n-1]);
}
//去除多维数组重复值结束
//去除数组空值
unset($page);
$page=array();//重新定义page数组
$page=array_filter($paget);
//print_r($page);
$u=0;
$title=array();
$content=array();
$temp=”;
$tt=array();
foreach ($page as $key=>$value)
{
//外围循环,针对一个帖子
if (is_array($value))
{
foreach ($value as $k1=>$v1)
{
//页内循环,针对一个帖子的N页
$snoopy=new Snoopy();
$snoopy->fetch($v1);
$temp=$snoopy->results;
//读取标题
if (!preg_match_all(“/ <h2>(.*) <//h2>/i”,$temp,$tt))
{
echo “no title”;
exit;
}
else
{
$title[$u]=$tt[1][1];
}
unset($tt);
//读取内容
if (!preg_match_all(“/ <div id=/”postmessage_[0-9]{1,8}/” class=/”t_msgfont/”>(.*) <//div>/i”,$temp,$tt))
{
print_r($tt);
echo “no content1″;
exit;
}
else
{
foreach ($tt[1] as $c=>$c2)
{
$content[$u].=$c2;
}
}
}
}
else
{
//直接取页内容
$snoopy=new Snoopy();
$snoopy->fetch($value);
$temp=$snoopy->results;
//读取标题
if (!preg_match_all(“/ <h2>(.*) <//h2>/i”,$temp,$tt))
{
echo “no title”;
exit;
}
else
{
$title[$u]=$tt[1][1];
}
unset($tt);
//读取内容
if (!preg_match_all(“/ <div id=/”postmessage_[0-9]*/” class=/”t_msgfont/”>(.*) <//div>/i”,$temp,$tt))
{
echo “no content2″;
exit;
}
else
{
foreach ($tt[1] as $c=>$c2)
{
$content[$u].=$c2;
}
}
}
$u++;
}
print_r($content);
}
$i++;
}
}
else
{
echo “login failed”;
exit;
}
?>

Posted in PHP / MySQL Tagged PHPsnoopy Leave a reply

snoopy.class.php php模拟登陆

官方网站http://snoopy.sourceforge.net/

下面是它的一些特征:

1、方便抓取网页的内容

2、方便抓取网页的文字(去掉HTML代码)

3、方便抓取网页的链接

4、支持代理主机

5、支持基本的用户/密码认证模式

6、支持自定义用户agent,referer,cookies和header内容

7、支持浏览器转向,并能控制转向深度

8、能把网页中的链接扩展成高质量的url(默认)

9、方便提交数据并且获取返回值

10、支持跟踪HTML框架(v0.92增加)

11、支持再转向的时候传递cookies

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

 

  1. <?
  2. include ”Snoopy.class.php”;
  3. $snoopy = new Snoopy;
  4. $snoopy->fetchtext(“http://www.phpobject.net/blog”);
  5. echo $snoopy->results;
  6. ?>
  7. ^_^,不错把,在比如抓取链接
  8. <?
  9. include ”Snoopy.class.php”;
  10. $snoopy = new Snoopy;
  11. $snoopy->fetchlinks(“http://www.phpobject.net/blog”);
  12. print_r($snoopy->results);
  13. ?>
  14. --------------------
  15. <?phpinclude(“snoopy.class.php”);
  16. $snoopy = new Snoopy;
  17. // need an proxy?://
  18. $snoopy->proxy_host = ”my.proxy.host”;
  19. $snoopy->proxy_port = ”8080″;
  20. // set browser and referer:
  21. $snoopy->agent = ”Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)”;
  22. $snoopy->referer = ”http://www.jonasjohn.de/”;
  23. // set some cookies:
  24. $snoopy->cookies["SessionID"] = ’238472834723489′;
  25. $snoopy->cookies["favoriteColor"] = ”blue”;
  26. // set an raw-header:
  27. $snoopy->rawheaders["Pragma"] = ”no-cache”;
  28. // set some internal variables:
  29. $snoopy->maxredirs = 2;
  30. $snoopy->offsiteok = false;
  31. $snoopy->expandlinks = false;
  32. // set username and password (optional)//
  33. $snoopy->user = ”joe”;
  34. snoopy->pass = ”bloe”;
  35. // fetch the text of the website www.google.com:
  36. if($snoopy->fetchtext(“http://www.google.com”))
  37. {     // other methods: fetch, fetchform, fetchlinks, submittext and submitlinks
  38.         // response code:    print ”response code: ”.$snoopy->response_code.”<br/>\n”;
  39.         // print the headers:        print ”<b>Headers:</b><br/>”;
  40.     while(list($key,$val) = each($snoopy->headers))
  41.     {
  42.        print $key.”: ”.$val.”<br/>\n”;
  43.     }
  44.      print ”<br/>\n”;
  45.         // print the texts of the website:    print ”<pre>”.htmlspecialchars($snoopy->results).”</pre>\n”;
  46.     }
  47.     else
  48.      {    print ”Snoopy: error while fetching document: ”.$snoopy->error.”\n”;
  49. }
  50. ?>

--------------------------------

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

 

  1. <?
  2. include ”Snoopy.class.php”;
  3. $snoopy = new Snoopy;
  4. $snoopy->fetchform(“http://www.phpx.com/happy/logging.php?action=login”);
  5. print $snoopy->results;
  6. ?>

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

  1. <?
  2. include ”Snoopy.class.php”;
  3. $snoopy = new Snoopy;
  4. $submit_url = ”http://www.phpx.com/happy/logging.php?action=login”;
  5.      $submit_vars["loginmode"] = ”normal”;
  6.      $submit_vars["styleid"] = ”1″;
  7.      $submit_vars["cookietime"] = ”315360000″;
  8.      $submit_vars["loginfield"] = ”username”;
  9.      $submit_vars["username"] = ”********”; //你的用户名
  10.      $submit_vars["password"] = ”*******”;   //你的密码
  11.      $submit_vars["questionid"] = ”0″;
  12.      $submit_vars["answer"] = ”";
  13.      $submit_vars["loginsubmit"] = ”提 &nbsp; 交”;
  14.      $snoopy->submit($submit_url,$submit_vars);
  15.      print $snoopy->results;
  16. ?>
分享到:
评论

相关推荐

    PHP采集器Snoopy详解

    标题 "PHP采集器Snoopy详解" 描述的是一个用于PHP的网络数据抓取工具,名为Snoopy。Snoopy作为一个PHP类,其主要功能是模拟浏览器的行为,包括获取网页内容、处理表单提交等。它需要PHP版本在4以上,并依赖于PCRE...

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

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

    PHP采集利器 Snoopy 试用心得

    (下载snoopy) Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。 Snoopy的一些特点: * 方便抓取网页的内容 * 方便抓取网页的文本内容 (去除HTML标签) * 方便抓取网页的链接 *...

    基于PHP的snoopy 强大的PHP采集类.zip

    《基于PHP的Snoopy:强大的PHP采集类详解》 在Web开发中,数据抓取或网络爬虫是一项常见的任务,用于从网站上获取信息,分析网页内容,甚至构建搜索引擎。PHP作为流行的服务器端脚本语言,也拥有许多用于网络爬虫的...

    PHP采集类Snoopy抓取图片实例

    PHP采集类Snoopy抓取图片实例知识点详解: 1. PHP采集类概念 PHP采集类是一种用于网络数据采集的工具,可以帮助开发者从网页中提取所需的信息。在PHP开发中,经常需要从外部网站获取数据,比如文本内容、图片地址等...

    基于PHP的snoopy强大的PHP采集类源码.zip

    【标题】"基于PHP的snoopy强大的PHP采集类源码.zip" 提供的是一个用于网页数据抓取的工具,Snoopy是一个流行的PHP类库,专为处理Web抓取和模拟浏览器行为而设计。在PHP开发中,当需要从网站获取数据而没有提供API时...

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

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

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

    Snoopy是一个广泛应用于PHP项目的网页抓取工具,它可以帮助开发者轻松地获取网页内容,模拟浏览器发送HTTP请求,并处理登录、表单提交等复杂交互。 【描述】中提到的"强大的PHP采集类"暗示了Snoopy类在数据抓取和...

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

    这个类特别适合于开发网页抓取程序或“小偷程序”,即那些需要从网站上自动获取数据的应用。Snoopy不需要PHP的额外扩展支持,即使服务器不支持cURL,它也是个很好的替代方案。 Snoopy的主要特点包括: 1. **抓取...

    Snoopy.class.php类及中文说明

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

    snoopy php来提取网页中你要的信息

    ### Snoopy PHP库详解:轻松抓取网页信息 在当今数据驱动的世界里,网页抓取技术变得越来越重要。无论是为了数据分析、市场调研还是自动化任务处理,掌握一种有效的网页抓取工具都是必不可少的。Snoopy作为一款用...

    Php多线程内容采集器(集成snoopy simple_html_dom)。

    使用php curl族的多线程函数,并结合开源的snoopy 和simple_html_dom 对html的处理,使采集特定区域的内容轻松起来。当然,您也可以设置通过正则来采集。程序也可以采集远程图片到本地。详细使用说明见readme.html. ...

    snoopy-2.0

    《Snoopy-2.0:网页数据采集的利器》 在互联网大数据时代,数据的收集、分析与应用成为企业及研究者的重要工作之一。Snoopy-2.0,作为一个出色的网页数据采集类库,为这个过程提供了高效且便捷的解决方案。本文将...

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

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

    Snoopy

    在实际应用中,"Snoopy-1.2.3"可能是这个库的一个特定版本,包含了更新、修复和可能的性能优化。使用这个版本前,开发者通常需要将其解压并按照提供的文档或示例代码进行安装和配置。 总的来说,Snoopy是一个强大的...

    2014最新Snoopy.class.php

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

Global site tag (gtag.js) - Google Analytics