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


Posted in PHP onJune 19, 2014

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

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

Snoopy类方法及示例:

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。

Snoopy采集类属性: (默认值在括号里)

$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

下面是一个示例:

include "Snoopy.class.php";

 $snoopy = new Snoopy;

  

 $snoopy->proxy_host = "https://3water.com";

 $snoopy->proxy_port = "80";

  

 $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";

 $snoopy->referer = "https://3water.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("https://3water.com"))

 {

 echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n";

 }

 else

 echo "error fetching document: ".$snoopy->error."\n";

获取指定url内容

<?php

 $url = "https://3water.com";

 include("snoopy.php");

 $snoopy = new Snoopy;

 $snoopy->fetch($url); //获取所有内容

 echo $snoopy->results; //显示结果

 //可选以下

 $snoopy->fetchtext //获取文本内容(去掉html代码)

 $snoopy->fetchlinks //获取链接

 $snoopy->fetchform  //获取表单

 ?>

表单提交

<?php

$formvars["username"] = "admin";

$formvars["pwd"] = "admin";

$action = "https://3water.com";//</a>表单提交地址

$snoopy->submit($action,$formvars);//$formvars为提交的数组

echo $snoopy->results; //获取表单提交后的 返回的结果

//可选以下

$snoopy->submittext; //提交后只返回 去除html的 文本

$snoopy->submitlinks;//提交后只返回 链接

?>

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

伪装浏览器

<?php

$formvars["username"] = "lanfengye";

$formvars["pwd"] = "lanfengye";

$action = "https://3water.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 = "https://3water.com"; //伪装来源页地址 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 所以取得的验证码和第一次输入的是一样的。

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

<?php
$snoopy->proxy_host = "https://3water.com";
$snoopy->proxy_port = "8080"; //使用代理
$snoopy->maxredirs = 2; //重定向次数
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
// 例如链接为 /images/taoav.gif 可改为它的全链接 <a href="https://3water.com/images/taoav.gif">https://3water.com/images/taoav.gif</a>
$snoopy->maxframes = 5 //允许的最大框架数
//注意抓取框架的时候 $snoopy->results 返回的是一个数组
$snoopy->error //返回报错信息
?>

PHP 相关文章推荐
比较全的PHP 会话(session 时间设定)使用入门代码
Jun 05 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
php中全局变量global的使用演示代码
May 18 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php比较两个绝对时间的大小
Jan 31 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
ThinkPHP3.2.2的插件控制器功能
Mar 05 PHP
PHP下载文件的函数实例代码
May 18 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
老生常谈PHP面向对象之标识映射
Jun 21 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 #PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 #PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 #PHP
PHP获取文件的MD5值并判断是否被修改的例子
Jun 19 #PHP
PHP中strlen()和mb_strlen()的区别浅析
Jun 19 #PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 #PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 #PHP
You might like
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
python实现剪切功能
2019/01/23 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
Python中私有属性的定义方式
2020/03/05 Python
基于python图像处理API的使用示例
2020/04/03 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
入党自我鉴定
2014/03/25 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
信访维稳承诺书
2015/05/04 职场文书
遗失证明范文
2015/06/19 职场文书
党课主持词大全
2015/06/30 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技
Oracle锁表解决方法的详细记录
2022/06/05 Oracle