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结合飞信 免费天气预报短信
May 07 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
Nov 10 PHP
PHP提取字符串中的图片地址[正则表达式]
Nov 12 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
PHP导入导出Excel代码
Jul 07 PHP
php在数据库抽象层简单使用PDO的方法
Nov 03 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
Zend Framework+smarty用法实例详解
Mar 19 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
PHP实现重载的常用方法实例详解
Oct 18 PHP
PHP实现的日历功能示例
Sep 01 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
php 生成唯一id的几种解决方法
2013/03/08 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
jQuery 页面 Mask实现代码
2010/01/09 Javascript
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
bootstrap table实例详解
2017/01/06 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
2019/05/10 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
Linux下Python获取IP地址的代码
2014/11/30 Python
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
基于python实现计算两组数据P值
2020/07/10 Python
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
DBA的职责都有哪些
2012/05/16 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
打架检讨书300字
2014/02/02 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python