PHP使用Snoopy类抓取页面以及使用方式
Snoopy类是一个非常好用的网络访问类,它可以模拟浏览器的HTTP请求,做你想做的事情。现在让我们看一个简单的例子:
12345678910<?php$url='http://hi.baidu.com/phphack';include'snoopy.php';$snoopy=new Snoopy();$snoopy->fetch($url);//获取所有内容echo$snoopy->results;//显示结果 // 可选以下$snoopy->fetchtext($url);//获取文本内容(去掉html代 码)$snoopy->fetchlinks($url);//获取链接$snoopy->fetchform($url);//获取表单
见过了获取HTML内容了我们再看一下模拟表单提交的:
123456789101112<?php$formvars['username']='admin';$formvars['pwd']='admin';$action='http://hi.baidu.com /phphack';//表单提交地址 include'snoopy.php';$snoopy=new Snoopy();$snoopy->submit($action,$formvars);//$formvars为提交的数组 echo$snoopy->results;//获取表单提交后的 返回的结果//可选以下$snoopy->submittext();//提交后只返回 去除html的 文本$snoopy->submitlinks();//提交后只返回 链接// 什么,提交admin干什么?呵呵,我也不知道,不行你试试看能不能进去......
其实服务器获取到的你的浏览器信息也是你提供给它的,那咱不能给它个假的?可以,看下面的代码咯:
123456789101112131415161718<?php$formvars['username']='admin';$formvars['pwd']='admin';$action='http://hi.baidu.com/phphack';include'snoopy.php';$snoopy=new Snoopy();// 伪装 SESSION$snoopy->cookies['PHPSESSID']='sldigtcatosiclaodvfeeycoauy';// 伪装浏览器 MS 有点老$snoopy->agent='(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)';//伪装来源页地址 http_referer$snoopy->referer='http://hi.baidu.com/phphack';//cache 的http头信息 不允许缓存$snoopy->rawheaders['Pragma']='no-cache';//伪装ip,什么?本机!被黑客黑了 吧......$snoopy->rawheaders['X_FORWARDED_FOR']='127.0.0.101';$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完全为我们想到了(Ps:别拿来干坏事儿哦,嘿嘿):
1234567891011<?phpinclude'snoopy.php';$snoopy=new Snoopy();$snoopy->proxy_host='http://hi.baidu.com/phphack';//代理 撒$snoopy->proxy_port="8080";//使用代理$snoopy->maxredirs=2;//重定向次 数$snoopy->expandlinks=true;//是否补全链接 在采集的时候经常用到// 例如链接为 /images/taoav.gif 可改为它的全链接 http://www.taoav.com/images/taoav.gif$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.phpchina.com/index.php“;
$snoopy->expandlinks = true;
$snoopy->rawheaders["COOKIE"]=”__utmz=17229162.1227682761.29.7.utmccn=(referral)|utmcsr=phpchina.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%2FKw0×4bKz0N9lGk; xscdb_auth=8106rAyhKpQL49eMs%2FyhLBf3C6ClZ%2B2idSk4bExJwbQr%2BHSZrVKgqPOttHVr%2B6KLPg3DtWpTMUI4ttqNNVpukUj6ElM; cdbphpchina_onlineusernum=3721″;
$snoopy->fetch(”http://bbs.phpchina.com/forum-17-1.html“);
$n=ereg_replace(”href=\””,”href=\”http://bbs.phpchina.com/”,$snoopy->results );
echo ereg_replace(”src=\””,”src=\”http://bbs.phpchina.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.phpchina.com/”,$snoopy->results );
# echo ereg_replace(”src=\””,”src=\”http://bbs.phpchina.com/”,$n);