snoopy 强大的PHP采集类使用实例代码


Posted in PHP onDecember 09, 2010

下载地址: https://3water.com/codes/33397.html

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 = "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";

以下是一些代码片段:
1、获取指定url内容
<? 
$url = "https://3water.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 = "https://3water.com";//</a>表单提交地址 
$snoopy->submit($action,$formvars);//$formvars为提交的数组 
echo $snoopy->results; //获取表单提交后的 返回的结果 
//可选以下 
$snoopy->submittext; //提交后只返回 去除html的 文本 
$snoopy->submitlinks;//提交后只返回 链接 
?>

既然已经提交的表单 那就可以做很多事情 接下来我们来伪装ip,伪装浏览器
3 伪装
<?php 
$formvars["username"] = "admin"; 
$formvars["pwd"] = "admin"; 
$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 所以取得的验证码和第一次输入的是一样的。
4 有时我们可能需要伪造更多的东西,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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
php操作JSON格式数据的实现代码
Dec 24 PHP
PHP文件注释标记及规范小结
Apr 01 PHP
php存储过程调用实例代码
Feb 03 PHP
php对象和数组相互转换的方法
May 12 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
php简单复制文件的方法
May 09 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
PHP 类与构造函数解析
Feb 06 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
PHPwind整合最土系统用户同步登录实现方法
Dec 08 #PHP
php iconv() : Detected an illegal character in input string
Dec 05 #PHP
php printf输出格式使用说明
Dec 05 #PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 #PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 #PHP
php 学习资料零碎东西
Dec 04 #PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 #PHP
You might like
php强制下载类型的实现代码
2011/04/21 PHP
php实例分享之二维数组排序
2014/05/15 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
2015/09/30 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
2015/03/31 Javascript
require.js的用法详解
2015/10/20 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
Python pandas常用函数详解
2018/02/07 Python
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
村居抓节水倡议书
2014/05/19 职场文书
运动会演讲稿200字
2014/08/25 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL
springboot读取nacos配置文件
2022/05/20 Java/Android