Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung der PHP-Datenerfassungsklasse Snoopy

Verwendung der PHP-Datenerfassungsklasse Snoopy

巴扎黑
巴扎黑Original
2016-11-22 16:38:421559Durchsuche

Detaillierte Erklärung der PHP-Sammlung Snoopy
Detaillierte Erklärung der Snoopy-Anwendung des PHP-Sammlungstools
Snoopy ist eine PHP-Klasse, die zur Simulation der Funktionen eines Browsers verwendet wird und Webinhalte abrufen und Formulare senden kann. Für den korrekten Betrieb von Snoopy ist es erforderlich, dass die PHP-Version Ihres Servers 4 oder höher ist und PCRE (Perl-kompatible reguläre Ausdrücke) unterstützt, was von grundlegenden LAMP-Diensten unterstützt wird.
1. Einige Funktionen von Snoopy:
1. Den Inhalt der Webseite abrufen
2. Den Textinhalt der Webseite abrufen (HTML-Tags entfernen) fetchtext
3. Die Links abrufen und Formulare der Webseite fetchlinks fetchform
4. Unterstützung des Proxy-Hosts
5. Unterstützung der grundlegenden Überprüfung von Benutzername/Passwort
6. Unterstützung der Einstellung von user_agent, referer (Quelle), Cookies und Header-Inhalt (Header-Datei)
7. Unterstützt die Browserumleitung und kann die Umleitungstiefe steuern
8. Kann Links auf Webseiten in hochwertige URLs erweitern (Standard)
9. Daten übermitteln und Rückgabewerte erhalten
10. Unterstützung Tracking-HTML-Framework
11. Unterstützt die Weiterleitung von Cookies, wenn PHP4 oder höher erforderlich ist. Da es sich um eine PHP-Klasse handelt, ist eine Erweiterung der Unterstützung nicht erforderlich. Dies ist die beste Wahl, wenn der Server Curl nicht unterstützt.
2. Klassenmethode:
fetch($URI)
——————
Dies ist die Methode, die zum Erfassen des Inhalts der Webseite verwendet wird. Der $URI-Parameter ist die URL-Adresse der gecrawlten Webseite. Die abgerufenen Ergebnisse werden in $this->results gespeichert. Wenn Sie einen Frame scrapen, verfolgt Snoopy jeden Frame, speichert ihn in einem Array und speichert ihn dann in $this->results.
fetchtext($URI)
——————
Diese Methode ähnelt fetch(). Der einzige Unterschied besteht darin, dass diese Methode HTML-Tags und andere irrelevante Daten entfernt und nur den Textinhalt zurückgibt auf der Webseite.
fetchform($URI)
——————
Diese Methode ähnelt fetch(). Der einzige Unterschied besteht darin, dass diese Methode HTML-Tags und andere irrelevante Daten entfernt und nur das Formular zurückgibt Inhalt der Webseite (Formular).
fetchlinks($URI)
————-
Diese Methode ähnelt fetch(). Der einzige Unterschied besteht darin, dass diese Methode HTML-Tags und andere irrelevante Daten entfernt und nur die Links zurückgibt die Webseite (Link).
Standardmäßig werden relative Links automatisch vervollständigt und in vollständige URLs umgewandelt.
submit($URI,$formvars)
————————-
Diese Methode sendet ein Bestätigungsformular an die durch $URL angegebene Linkadresse. $formvars ist ein Array, das Formularparameter speichert.
submittext($URI,$formvars)
————————–
Diese Methode ähnelt subscribe(). Der einzige Unterschied besteht darin, dass diese Methode HTML-Tags und andere irrelevante Daten entfernt . Es wird nur der Textinhalt der Webseite nach der Anmeldung zurückgegeben.
submitlinks($URI)
————-
Diese Methode ähnelt subscribe(). Der einzige Unterschied besteht darin, dass diese Methode HTML-Tags und andere irrelevante Daten entfernt und nur die Links zurückgibt die Webseite (Link).
Standardmäßig werden relative Links automatisch vervollständigt und in vollständige URLs umgewandelt.
3. Klassenattribute: (Standardwert steht in Klammern)
$host Der verbundene Host
$port Der verbundene Port
$proxy_host Der verwendete Proxy-Host, falls vorhanden
$ Proxy_port Der Proxy Verwendeter Host-Port, falls vorhanden
$agent Tarnung des Benutzeragenten (Snoopy v0.1)
$Referer-Quellinformationen, falls vorhanden
$cookies Cookies, falls vorhanden
$rawheaders Andere Header-Informationen, falls vorhanden
$maxredirs Maximale Anzahl von Weiterleitungen, 0=nicht zulässig (5)
$offsiteok, ob Weiterleitungen außerhalb der Website zugelassen werden sollen oder nicht (true)
$expandlinks Ob alle Links zu vollständigen Adressen vervollständigt werden sollen (true). )
$Benutzername für die Authentifizierung, falls verfügbar
$Benutzername für die Authentifizierung, falls verfügbar
$accept HTTP-Akzeptanztyp ( image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */ *)
$error Wo kann der Fehler gemeldet werden, falls vorhanden
$response_code Der vom Server zurückgegebene Antwortcode
$headers Vom Server zurückgegebene Header-Informationen
$maxlength Die längste zurückgegebene Datenlänge
$read_timeout Timeout des Lesevorgangs (erfordert PHP 4 Beta 4)
Auf 0 gesetzt, um kein Timeout zu erhalten
$timed_out Wenn einmal gelesen Der Vorgang ist abgelaufen, gibt dieses Attribut „true“ zurück (erfordert PHP 4 Beta 4)
$maxframes Die maximal zulässige Anzahl von Frames, die verfolgt werden dürfen
$status Der Status des erfassten http
$temp_dir Die temporäre Datei, in die der Webserver schreiben kann. Verzeichnis (/tmp)
$curl_path cURL-Binärverzeichnis , wenn es keine cURL-Binärdatei gibt, setzen Sie sie auf false
4. Das Folgende ist die Demo:
$snoopy = new Snoopy-> ;proxy_host = "www.baidu.com";
$snoopy->proxy_port = "8080";
$snoopy->agent = "(kompatibel; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98 )“;
$snoopy->referer = „http://www.baidu.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("http://www.baidu.com")) 

echo "

".htmlspecialchars($snoopy->results). " 
n";
 
}
 
sonst
 
echo „Fehler beim Abrufen des Dokuments: „.$snoopy->error.“n“; 
snoopy采集phpchina示例 
//采集phpchina 
set_time_limit(0); 
require_once("Snoopy.class.php"); 
$snoopy=new Snoopy(); 
//登陆论坛 
$submit_url = "http://www.phpchina.com/bbs/logging.php?action=login"; 
$submit_vars["loginmode"] = "normal"; 
$submit_vars["styleid"] = "1"; 
$submit_vars["cookietime"] = "315360000"; 
$submit_vars["loginfield"] = "Benutzername"; 
$submit_vars["username"] = "***"; //你的用户名 
$submit_vars["password"] = "*****"; //你的密码 
$submit_vars["questionid"] = "0"; 
$submit_vars["answer"] = ""; 
$submit_vars["loginsubmit"] = "Weiter"; 
$snoopy->submit($submit_url,$submit_vars); 
if ($snoopy->results) 

//获取连接地址 
$snoopy->fetchlinks("http://www.phpchina.com/bbs"); 
$url=array(); 
$url=$snoopy->results; 
//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= neuer Snoopy(); 
$snoopy->fetchlinks($value); 
$tie=array(); 
$tie[$i]=$snoopy->results; 
//print_r($tie); 
//转换数组 
foreach ($tie[$i] as $key=>$value) 

//匹配http://www.phpchina.com/bbs/viewthread .php?tid=68127& extra=page=1&page=1&sid=iBLZfK 
if (!preg_match("/^(http://www.phpchina.com/bbs/viewthread.php?tid=)[0-9]*& extra=page=1&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]=$pvalue; 
$m ; 


$j ; 

//去除重复项开始 
//$page=array_unique($page);只能用于一维数组 
$paget[0]=$page[0]; 
$nums=count($page); 
for ($n=1;$n <$nums;$n ) 

$paget[$n]=array_diff($page[$n],$page[$n-1 ]); 

//去除多维数组重复值结束 
//去除数组空值 
unset($page); 
$page=array();//重新定义page数组 
$page=array_filter($paget); 
//print_r($page); 
$u=0; 
$title=array(); 
$content=array(); 
$temp=''; 
$tt=array(); 
foreach ($page as $key=>$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 „kein Titel“; 
Ausgang; 

else 

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

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

print_r($tt); 
echo „no content1“; 
Ausgang; 

else 

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

$content[$u].=$c2; 




else 

//直接取页内容 
$snoopy=new Snoopy(); 
$snoopy->fetch($value); 
$temp=$snoopy->results; 
//读取标题 
if (!preg_match_all("/

(.*)

/i",$temp,$tt)) 

echo „kein Titel“; 
Ausgang; 

else 

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

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

echo "no content2"; 
Ausgang; 

else 

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

$content[$u].=$c2; 



$u ; 

print_r($content); 

$i ; 


else 

echo „Anmeldung fehlgeschlagen“; 
Ausgang; 

?>

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP-CurlNächster Artikel:PHP-Curl