snoopy(強大的PHP採集類) 實例應用

Snoopy是一個php類,用來模擬瀏覽器的功能,可以獲取網頁內容,發送表單。

下載地址: http://sourceforge.net/project/showfiles.php?group_id=2091

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
include "Snoopy.class.php";
 $snoopy = new Snoopy;
 
 $snoopy->proxy_host = "http://www.4wei.cn";
 $snoopy->proxy_port = "80";
 
 $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
 $snoopy->referer = "http://www.4wei.cn";
 
 $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("http://www.4wei.cn"))
 {
 echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n";
 }
 else
 echo "error fetching document: ".$snoopy->error."\n";

以下是一些代碼片段:
1獲取指定url內容

01
02
03
04
05
06
07
08
09
10
11
<?
 $url = "http://www.4wei.cn";
 include("snoopy.php");
 $snoopy = new Snoopy;
 $snoopy->fetch($url); //獲取所有內容
 echo $snoopy->results; //顯示結果
 //可選以下
 $snoopy->fetchtext //獲取文本內容(去掉html代碼)
 $snoopy->fetchlinks //獲取鏈接
 $snoopy->fetchform  //獲取表單
 ?>

2 表單提交

01
02
03
04
05
06
07
08
09
10
<?php
$formvars["username"] = "admin";
$formvars["pwd"] = "admin";
$action = "http://www.4wei.cn";//</a>表單提交地址
$snoopy->submit($action,$formvars);//$formvars爲提交的數組
echo $snoopy->results; //獲取表單提交後的 返回的結果
//可選以下
$snoopy->submittext; //提交後只返回 去除html的 文本
$snoopy->submitlinks;//提交後只返回 鏈接
?>

既然已經提交的表單 那就可以做很多事情 接下來我們來僞裝ip,僞裝瀏覽器

3 僞裝

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
$formvars["username"] = "admin";
$formvars["pwd"] = "admin";
$action = "http://www.4wei.cn";
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://www.4wei.cn; //僞裝來源頁地址 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完全爲我們想到了

01
02
03
04
05
06
07
08
09
10
<?php
$snoopy->proxy_host = "http://www.4wei.cn";
$snoopy->proxy_port = "8080"; //使用代理
$snoopy->maxredirs = 2; //重定向次數
$snoopy->expandlinks = true; //是否補全鏈接 在採集的時候經常用到
// 例如鏈接爲 /images/taoav.gif 可改爲它的全鏈接 <a href="http://www.4wei.cn/images/taoav.gif">http://www.4wei.cn/images/taoav.gif</a>
$snoopy->maxframes = 5 //允許的最大框架數
//注意抓取框架的時候 $snoopy->results 返回的是一個數組
$snoopy->error //返回報錯信息
?>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章