PHP采集利器 Snoopy 试用心得


Posted in PHP onJuly 03, 2011

Snoopy是什么? (下载snoopy)
Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
Snoopy的一些特点:
* 方便抓取网页的内容
* 方便抓取网页的文本内容 (去除HTML标签)
* 方便抓取网页的链接
* 支持代理主机
* 支持基本的用户名/密码验证
* 支持设置 user_agent, referer(来路), cookies 和 header content(头文件)
* 支持浏览器转向,并能控制转向深度
* 能把网页中的链接扩展成高质量的url(默认)
* 方便提交数据并且获取返回值
* 支持跟踪HTML框架(v0.92增加)
* 支持再转向的时候传递cookies (v0.92增加)
要想了解的更深入些,你自己Google一下吧。下面就给几个简单的例子:
1获取指定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 //获取表单

2 表单提交
PHP代码
$formvars["username"] = "admin"; 
$formvars["pwd"] = "admin"; 
$action = "https://3water.com";//表单提交地址 
$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 = "http://s.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 = "3water.com"; 
$snoopy->proxy_port = "8080"; //使用代理 
$snoopy->maxredirs = 2; //重定向次数 
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到 
// 例如链接为 /images/taoav.gif 可改为它的全链接 https://3water.com/images/taoav.gif,这个地方其实可以在最后输出的时候用ereg_replace函数自己替换 
$snoopy->maxframes = 5 //允许的最大框架数 
//注意抓取框架的时候 $snoopy->results 返回的是一个数组 
$snoopy->error //返回报错信息

上面的基本用法了解了,下面我就实例演示一次:
PHP代码
<? 
//echo var_dump($_SERVER); 
include("Snoopy.class.php"); 
$snoopy = new Snoopy; 
$snoopy->agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh- 
CN; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 FirePHP/0.2.1";//这项是浏览器信 
息,前面你用什么浏览器查看cookie,就用那个浏览器的信息(ps:$_SERVER可以查看到浏览器的信息) 
$snoopy->referer = "http://bbs.3water.com/index.php"; 
$snoopy->expandlinks = true; 
$snoopy->rawheaders["COOKIE"]="__utmz=17229162.1227682761.29.7.utmccn=(referral)|utmcsr=3water.com|utmcct=/html/index.html|utmcmd=referral; cdbphpchina_smile=1D2D0D1; cdbphpchina_cookietime=2592000; __utma=233700831.1562900865.1227113506.1229613449.1231233266.16; __utmz=233700831.1231233266.16.8.utmccn=(referral)|utmcsr=localhost:8080|utmcct=/test3.php|utmcmd=referral; __utma=17229162.1877703507.1227113568.1231228465.1231233160.58; uchome_loginuser=sinopf; xscdb_cookietime=2592000; __utmc=17229162; __utmb=17229162; cdbphpchina_sid=EX5w1V; __utmc=233700831; cdbphpchina_visitedfid=17; cdbphpchinaO766uPYGK6OWZaYlvHSuzJIP22VpwEMGnPQAuWCFL9Fd6CHp2e%2FKw0x4bKz0N9lGk; xscdb_auth=8106rAyhKpQL49eMs%2FyhLBf3C6ClZ%2B2idSk4bExJwbQr%2BHSZrVKgqPOttHVr%2B6KLPg3DtWpTMUI4ttqNNVpukUj6ElM; cdbphpchina_onlineusernum=3721"; 
$snoopy->fetch("http://bbs.3water.com"); 
$n=ereg_replace("href=\"","href=\"http://bbs.3water.com/",$snoopy->results ); 
echo ereg_replace("src=\"","src=\"http://bbs.3water.com/",$n); 
?>

这是模拟登陆PHPCHINA论坛的过程,首先要查看自己浏览器的信
息:echo var_dump($_SERVER);这句代码可以看到自己浏览器的信息,把
$_SERVER['HTTP_USER_AGENT']后边的内容复制下来,粘在$snoopy->agent的地方,然后就是要查看自己的
COOKIE了,用自己在论坛的账号登陆论坛后,在浏览器地址栏里输入
javascript:document.write(document.cookie),回车,就可以看到自己的cookie信息,复制粘贴
到$snoopy->rawheaders["COOKIE"]=的后边。(我的cookie信息为了安全起见已经删除了一段内容)

然后再注意:

# $n=ereg_replace("href=\"","href=\"http://bbs.3water.com/",$snoopy->results );

# echo ereg_replace("src=\"","src=\"http://bbs.3water.com/",$n);

这两句代码,因为采集到的内容所有的HTML源码地址都是相对链接,所以要替换成绝对链接,这样就可以引用论坛的图片和css样式了。

PHP 相关文章推荐
php 启动报错如何解决
Jan 17 PHP
ThinkPHP中的关联模型注意点
Jun 16 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
php给每个段落添加空格的方法
Mar 20 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
Apr 13 PHP
Laravel中GraphQL接口请求频率实战记录
Sep 01 PHP
php中的三元运算符使用说明
Jul 03 #PHP
PHP 数据结构 算法 三元组 Triplet
Jul 02 #PHP
php中批量删除Mysql中相同前缀的数据表的代码
Jul 01 #PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 #PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 #PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
Jun 30 #PHP
在php中判断一个请求是ajax请求还是普通请求的方法
Jun 28 #PHP
You might like
PHP的宝库目录--PEAR
2006/10/09 PHP
如何写php程序?
2006/12/08 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP文件上传类实例详解
2016/04/08 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[02:27]刀塔重生降临
2015/10/14 DOTA
python基础教程之面向对象的一些概念
2014/08/29 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
keras K.function获取某层的输出操作
2020/06/29 Python
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
当当网软件测试笔试题
2015/11/24 面试题
推荐信格式要求
2014/05/09 职场文书
廉洁校园实施方案
2014/05/25 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
2015年防汛工作总结
2015/05/15 职场文书
预备党员半年考察意见
2015/06/01 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL