首頁 > 後端開發 > php教程 > php資料抓取類別Snoopy使用

php資料抓取類別Snoopy使用

巴扎黑
發布: 2016-11-22 16:38:42
原創
1606 人瀏覽過

php 採集 Snoopy 詳解 
PHP採集利器snoopy應用詳解 
Snoopy是一個php類,用來模擬瀏覽器的功能,可以取得網頁內容,發送表單。 Snoopy正確運作需要你的伺服器的PHP版本在4以上,並且支援PCRE(Perl Compatible Regular Expressions),基本的LAMP服務都支援。
一、Snoopy的一些特點: 
  1.抓取網頁的內容fetch 
  2.抓取網頁的文字內容(去除HTML標籤) fetchtext 
  3.抓取網頁的鏈接,表格支援
  5.支援基本的使用者名稱/密碼驗證 
  6.支援設定user_agent, referer(來路), cookies和header content(頭檔) 
  7.支援瀏覽器重新導向,並能控制深度重定向能把網頁中的連結擴展成高品質的url(預設) 
  9.提交資料並且取得回傳值 
  10.支援追蹤HTML框架 
  11.支援重定向的時候傳遞cookies,要求php4以上就可以了,由於php4以上就可以了,由於php4以上就可以了,由於php4以上就可以了,由於php4以上就可以了,由於php4以上就可以了,由於php4以上就可以了,由於php4以上就可以了,由於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 使用的代理主機連接埠,如果有的代理主機,如果有的話 
$proxy_port 使用的代理主機連接埠,如果有的代理主機連接埠話 
$agent 用戶代理偽裝(Snoopy v0.1) 
$referer 來路信息,如果有的話 
$cookies cookies, 如果有的話 
$rawheaders 其他的頭信息, 如果有的話 
$rawheaders 其他的頭信息, 如果有的話 ir
定向次數,0= 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+) 
$read_timeout 讀取作業逾時(requires PHP 4 Beta 4+) 
$read_timeout 讀取作業逾時(requires PHP 4 Beta 4+) 
$read_timeout 讀取作業逾時(requires PHP 4 Beta 4+) 
$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"; >proxy_host = "www.baidu.com"; 
$snoopy->proxy_port = "8080"; 
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; ->referer = "http://www.baidu.com/"; 
$snoopy->cookies["SessionID"] = 238472834723489l; 
$snoopy->cookies["favoriteColor"] = "RED"; 
$snoopy->rawheaders["Pragma"] = "no-cache"; 
$史努比->maxredirs = 2; 
$oopy->offsitesnoopy->offsiteok = false; 
$snoopy->expandlinks = false; 
$snoopy->user = "joe"; 
$snoopy->pass = "bloe"; 
if($snoopy->fetchtext("http://www. baidu.com")) 

echo "

".htmlspecialchars($snoopy->results)." 
登入後複製
; n”;
 
}
不然 

 
echo取得文件時發生錯誤:".$snoopy->error."n"; 
snoopy採集phpchina範例 
//採集phpchina 
set_time_limit(0); 
require_once("Soopy.class.class. $史努比=新史努比(); 
//登陸論壇 
$submit_url = "http://www.phpchina.com/bbs/logging.php?action=login"; 
$submit_vars["loginmode" ] = "正常"; 
$submit_vars["styleid"] = "1"; 
$submit_vars["cookietime"] = "315360000"; 
$submit_vars["loginfield"] = "使用者名稱"; 
$submit_vars["loginfield"] = "使用者名稱"; "使用者名稱"] = "***"; //您的使用者名稱
$submit_vars["password"] = "*****"; //你的密碼
$submit_vars["questionid"] = " 0"; 
$submit_vars["answer"] = ""; 
$submit_vars["loginsubmit"] = "投稿"; 
$snoopy->submit($submit_url,$submit_vars); 
$snoopy->submit($submit_url,$submit_vars); 
if> ) 

//取得連接位址 
$snoopy->fetchlinks("http://www.phpchina.com/bbs"); 
$url=array(); 
$url=$snoopy->結果; //print_r($url); 
foreach ($url as $key=>$value) 

//符合http://www.phpchina.com/bbs/forumdisplay.php?fid=156&sid=VfcqTR位址即論壇板塊位址
if (! preg_match("/^(http://www.phpchina.com/bbs/forumdisplay.php?fid=)[0-9]*&sid=[a-zA-Z]{6} /i",$value) ) 

unset($url[$key]); 


//print_r($url); 
///取得到板塊資料庫$url,循環訪問,此處取得第一模組第一頁的資料 
$i=0; 
foreach ($url as $key=>$value) 

if ($i>=1) 

//測試限制
break; } 
else 

//訪問該模組,提取帖子的連接地址,正式訪問裡需要帖子提取分頁的數據,然後根據分頁數據提取帖子數據 
$snoopy=new Snoopy(); 
$snoopy->fetchlinks ($value); 
$tie=array(); 
$tie[$i]=$snoopy->結果; 
//print_r($tie); 
//轉換吞吐量 
foreach ($tie[$i ] as $key=>$value) 

//匹配http://www.phpchina.com/bbs/viewthread.php?tid=68127& extra=page%3D1&page=1&sid=iBLZfK
if (!preg_match(" /^(http://www.phpchina.com/bbs/viewthread.php?tid=)[0-9]*&extra= page%3D1&page=[0-9]*&sid=[a-zA-Z]{ 6}/i",$value)) 

unset($tie[$i][$key]); 


//print_r($tie[$i]); 
//整理隊列,將同一個貼文不同頁面的內容放一個佇列裡 
$left='';//連接左邊公用位址 
$j=0; 
$page=array(); 
foreach ($tie[$i] as $ key=>$value)

$left=substr($value,0,52); 
$m=0; 
foreach ($tie[$i]as $pkey=>$pvalue) 


// 重組資料庫 
if (substr($pvalue,0,52)==$left) 

$page[$j ][$m]=$p值; 
$m++; 


$m++; 


$m++; } 
/刪除重複項開始 
//$page=array_unique($page);只能用於一維資料庫 
$paget[0]=$page[0]; 
$nums=count($page); 
for ($n=1;$n { 
$paget[$n]=array_diff($page[$n],$page[$n-1]); 

//增加多維資料庫重複值結束 
// 增加資料庫空值 
unset($page); 
$page=array();//重新定義頁備份
$page=array_filter($paget); 
//print_r($ page); 
$u=0; 
$title=陣列(); 
$內容=陣列(); 
$temp=''; 
$tt=陣列(); 
foreach ($page as $keykey=> $value) 

//社會循環,針對一個帖子
if (is_array($value)) 

foreach ($value as $k1=>$v1)
{的N頁
$snoopy=new Snoopy(); 
$snoopy->fetch($v1); 
$temp=$snoopy->results; 
//讀取標題 
if (!preg_match_all("/

(.*)

/i",$temp,$tt)) 

echo "no title"; 
exit; 

else 

$title[$u]
else 

$title[$u]=$tt[1]。

unset($tt); 
//讀取內容 
if (!preg_match_all("/
(.*)
/i",$temp,$tt)) 

print_r($tt); 
echo "no content1"; 
exit; 

else 
{ exit; 

else 
{ c=>$c2) 

$content[$u].=$c2; 




else 
{ snoopy->fetch($value); 
$temp=$snoopy->results; 
//讀標題 
if (!preg_match_all("/

(.*)

/i",$temp ,$tt)) 

echo "no title"; 
exit; 

else 

$title[$u]=$tt[1][1]? //讀取內容 
if (!preg_match_all("/
(.*)
/i",$temp,$tt) ) 

echo "no content2"; 
exit; 

else 

foreach ($tt[1]as $c=>$c2) 
foreach ($tt[1]as $c=>$c2) 
{ } 


$u++; 

print_r($content); 

$i++; 

} } 
?>
相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板