Maison  >  Article  >  développement back-end  >  Introduction à un exemple de snoopy de classe de collection PHP

Introduction à un exemple de snoopy de classe de collection PHP

小云云
小云云original
2018-03-10 13:11:348424parcourir

Snoopy est une classe php utilisée pour imiter les fonctions d'un navigateur Web. Elle peut effectuer les tâches d'obtention de contenu Web et d'envoi de formulaires. Site officiel http://snoopy.sourceforge.net/

Quelques fonctionnalités de Snoopy :

  • Récupérer le contenu de la page Web fetch()

  • Récupérer le contenu texte de la page Web (supprimer les balises HTML) fetchtext()

  • Récupérer les liens de la page Web, formulaire fetchlinks() fetchform()

  • Prise en charge de l'hôte proxy

  • Prise en charge de la vérification de base du nom d'utilisateur/mot de passe

  • Prise en charge du paramètre user_agent, referer (origine ) ), les cookies et le contenu de l'en-tête (fichier d'en-tête)

  • Prend en charge la redirection du navigateur et peut contrôler la profondeur de la redirection

  • Peut mettre la page Web dans Le lien est développé en une URL de haute qualité (par défaut)

  • Envoyez les données et obtenez la valeur de retour

  • Prise en charge du framework HTML de suivi

  • Prend en charge le passage des cookies lors de la redirection

Nécessite php4 ou supérieur. Puisqu'il s'agit d'une classe PHP, il n'est pas nécessaire d'étendre la prise en charge. C'est le meilleur choix lorsque le serveur ne prend pas en charge curl.

Méthode de classe

1. fetch($uri)

C'est la méthode utilisée pour récupérer le contenu de la page Web. Le paramètre $URI est l'adresse URL de la page Web analysée. Les résultats récupérés sont stockés dans $this->results.

Si vous grattez une image, Snoopy suivra chaque image et la stockera dans un tableau, puis la stockera dans $this->results.

  1. <?php  
    $url = "http://www.nowamagic.net/librarys/veda/";  
    include("./Snoopy.class.php");  
    $snoopy = new Snoopy;  
    $snoopy->fetch($url);        //获取所有内容
    echo $snoopy->results;       //显示结果
    ?>

2. fetchtext($URI)

Cette méthode est similaire à fetch(), la seule différence est que cette méthode supprimera les balises HTML et autres données non pertinentes, seul le contenu textuel de la page Web est renvoyé.

  1. <?php  
    $url = "http://www.nowamagic.net/librarys/veda/";  
    include("./Snoopy.class.php");  
    $snoopy = new Snoopy;  
    $snoopy->fetchtext($url);        //获取文本内容
    echo $snoopy->results;       //显示结果
    ?>

3. fetchform($URI)

Cette méthode est similaire à fetch(), la seule différence est que cette méthode supprimera les balises HTML et autres données non pertinentes et ne renverra que le contenu du formulaire (formulaire) dans la page Web.

4. fetchlinks($URI)

Cette méthode est similaire à fetch(). La seule différence est que cette méthode supprimera les balises HTML et autres données non pertinentes et ne renverra que les liens. la page web (lien ). Par défaut, les liens relatifs seront automatiquement complétés et convertis en URL complètes.

5. submit($URI,$formvars)

Cette méthode envoie un formulaire de confirmation à l'adresse du lien spécifiée par $URL. $formvars est un tableau qui stocke les paramètres du formulaire.

6. submittext($URI,$formvars)

Cette méthode est similaire à submit() La seule différence est que cette méthode supprimera les balises HTML et autres données non pertinentes et ne retournera que. les informations de connexion. Contenu textuel dans les pages Web.

7. submitlinks($URI)

Cette méthode est similaire à submit(). La seule différence est que cette méthode supprimera les balises HTML et autres données non pertinentes et ne renverra que les liens dans. la page web (lien ). Par défaut, les liens relatifs seront automatiquement complétés et convertis en URL complètes.

Attributs de classe (les valeurs par défaut sont entre parenthèses)

  • $host L'hôte connecté

  • $port Le connecté port

  • $proxy_host L'hôte proxy à utiliser, le cas échéant

  • $proxy_port Le port de l'hôte proxy à utiliser, le cas échéant

  • $agent Déguisement d'agent utilisateur (Snoopy v0.1)

  • $informations sur la source du référent, le cas échéant

  • $cookies cookies, le cas échéant

  • $rawheaders autres informations d'en-tête, le cas échéant

  • $maxredirs maximum Nombre de redirections, 0=non autorisé( 5)

  • $offsiteok s'il faut ou non autoriser les redirections hors site (vrai)

  • $expandlinks Indiquer si tous les liens doivent être complétés au complet. adresses (vrai)

  • $nom d'utilisateur d'authentification d'utilisateur, le cas échéant

  • $nom d'utilisateur d'authentification d'authentification, le cas échéant

  • $accepter http accepter le type (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)

  • $error Où se trouvait l'erreur signalé, le cas échéant

  • $response_code Le code de réponse renvoyé par le serveur

  • $headers Informations d'en-tête renvoyées par le serveur

  • $maxlength La plus longue longueur de données renvoyées

  • $read_timeout Délai d'expiration de l'opération de lecture (nécessite PHP 4 Beta 4+), défini sur 0 pour aucun délai d'attente

  • $timed_out Si une opération de lecture expire, cet attribut renvoie true (nécessite PHP 4 Beta 4+)

  • $maxframes Le nombre maximum d'images autorisées à être suivi

  • $status L'état de la page Web http

  • $temp_dir capturée Le répertoire de fichiers temporaires (/tmp) que le serveur peut écrivez dans le répertoire binaire

  • $curl_path cURL, s'il n'y a pas de binaire cURL, définissez-le sur false

Demo

  1. include "Snoopy.class.php";  
    $snoopy = new Snoopy;  
    $snoopy->proxy_host = "http://www.nowamagic.net/librarys/veda/";  
    $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)."
    n"; } else echo "error fetching document: ".$snoopy->error."n";

Obtenir le contenu de l'URL spécifié :

  1. <?  
    $url = "http://www.nowamagic.net/librarys/veda/";  
    include("snoopy.php");  
    $snoopy = new Snoopy;  
    $snoopy->fetch($url); //获取所有内容
    echo $snoopy->results; //显示结果
    //可选以下
    //$snoopy->fetchtext //获取文本内容(去掉html代码)
    //$snoopy->fetchlinks //获取链接
    //$snoopy->fetchform  //获取表单
    ?>

formulaire Soumettre :

  1. <?php  
    $formvars["username"] = "admin";  
    $formvars["pwd"] = "admin";  
    $action = "http://www.nowamagic.net/librarys/veda/";//表单提交地址  
    $snoopy->submit($action,$formvars);//$formvars为提交的数组
    echo $snoopy->results; //获取表单提交后的 返回的结果
    //可选以下
    $snoopy->submittext; //提交后只返回 去除html的 文本
    $snoopy->submitlinks;//提交后只返回 链接
    ?>

Maintenant que le formulaire a été soumis, vous pouvez faire beaucoup de choses. Ensuite, masquons l'adresse IP et le navigateur :

  1. <?php  
    $formvars["username"] = "admin";  
    $formvars["pwd"] = "admin";  
    $action = "http://www.4wei.cn";  
    include "snoopy.php";  
    $snoopy = new Snoopy;  
    $snoopy->cookies["PHPSESSID"] = &#39;fc106b1918bd522cc863f36890e6fff7&#39;; //伪装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;
  2. ?>

原来我们可以伪装session 伪装浏览器 ,伪装ip, haha 可以做很多事情了。例如 带验证码,验证ip 投票, 可以不停的投。

ps:这里伪装ip ,其实是伪装http头,所以一般的通过 REMOTE_ADDR 获取的ip是伪装不了,反而那些通过http头来获取ip的(可以防止代理的那种) 就可以自己来制造ip。

关于如何验证码 ,简单说下:首先用普通的浏览器, 查看页面 , 找到验证码所对应的sessionid,同时记下sessionid和验证码值,接下来就用snoopy去伪造 。

原理:由于是同一个sessionid 所以取得的验证码和第一次输入的是一样的。

有时我们可能需要伪造更多的东西,snoopy完全为我们想到了:

  1. <?php  
    $snoopy->proxy_host = "http://www.nowamagic.net/librarys/veda/";  
    $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 //返回报错信息
    ?>

比较完整的示例:

  1. /**
    * You need the snoopy.class.php from 
    * http://snoopy.sourceforge.net/
    */
    include("snoopy.class.php");  
    $snoopy = new Snoopy;  
    // need an proxy?:
    //$snoopy->proxy_host = "my.proxy.host";
    //$snoopy->proxy_port = "8080";
    // set browser and referer:
    $snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";  
    $snoopy->referer = "http://www.jonasjohn.de/";  
    // set some cookies:
    $snoopy->cookies["SessionID"] = &#39;238472834723489&#39;;  
    $snoopy->cookies["favoriteColor"] = "blue";  
    // set an raw-header:
    $snoopy->rawheaders["Pragma"] = "no-cache";  
    // set some internal variables:
    $snoopy->maxredirs = 2;  
    $snoopy->offsiteok = false;  
    $snoopy->expandlinks = false;  
    // set username and password (optional)
    //$snoopy->user = "joe";
    //$snoopy->pass = "bloe";
    // fetch the text of the website www.google.com:
    if($snoopy->fetchtext("http://www.google.com")){   
        // other methods: fetch, fetchform, fetchlinks, submittext and submitlinks
        // response code:
        print "response code: ".$snoopy->response_code."<br/>n";  
        // print the headers:
        print "<b>Headers:</b><br/>";  
        while(list($key,$val) = each($snoopy->headers)){  
            print $key.": ".$val."<br/>n";  
        }  
        print "<br/>n";  
        // print the texts of the website:
        print htmlspecialchars($snoopy->results)."n";  
    }  
    else {  
        print "Snoopy: error while fetching document: ".$snoopy->error."n";  
    }

用Snoopy类完成一个简单的图片采集:

  1. <meta http-equiv=&#39;content-type&#39; content=&#39;text/html;charset=utf-8&#39;>  
    <?php      
    include &#39;Snoopy.class.php&#39;;   //加载Snoopy类     
    $snoopy = new Snoopy();       //实例化一个对象
    $sourceURL = "http://www.nowamagic.net/librarys/veda/";    //要抓取的网页  
    $snoopy->fetchlinks($sourceURL);        //获得网页的链接
    $a = $snoopy->results;     //得到网页链接的结果
    $re = "/d+.html$/";     //匹配的正则
    //过滤获取指定的文件地址请求  
    foreach ($a as $tmp) {   
        if (preg_match($re, $tmp)) {  
            $aa=$tmp;          
        }      
    }    
    getImgURL($aa);  
    function getImgURL($siteName)   
    {          
        $snoopy = new Snoopy();          
        $snoopy->fetch($siteName);                  
        $fileContent = $snoopy->results;    //获取过滤后的页面的内容            
        //匹配图片的正则表达式        
        $reTag = "/<img[^s]+src="(http://[^"]+).(jpg|png|gif|jpeg)"[^/]*/>/i";                
        if (preg_match($reTag, $fileContent)) {    
            //过滤图片
            $ret = preg_match_all($reTag, $fileContent, $matchResult);                       
            for ($i = 0, $len = count($matchResult[1]); $i < $len; ++$i)   
            {        
                saveImgURL($matchResult[1][$i], $matchResult[2][$i]);              
            }          
        }      
    }          
    function saveImgURL($name, $suffix) {   
        $url = $name.".".$suffix;                  
        echo "请求的图片地址:".$url."<br/>";                  
        $imgSavePath = "E:/123/images/";  //图片保存地址      
        $imgId =mt_rand(); //产生一个随机的文件名
        if ($suffix == "gif") {   
            //根据图片类型,放入不同的文件夹下面           
            $imgSavePath .= "emotion";          
        }   
        else
        {              
            $imgSavePath .= "topic";          
        }          
        $imgSavePath .= ("/".$imgId.".".$suffix);  //组装要保存的文件名
        if (is_file($imgSavePath)) {     
            //判断文件名是否存在,存在则删除         
            unlink($imgSavePath);              
            echo "<p style=&#39;color:#f00;&#39;>文件".$imgSavePath."已存在,将被删除</p>";          
        }    
        $imgFile = file_get_contents($url); //读取网络文件     
        $flag = file_put_contents($imgSavePath,$imgFile);   //写入到本地 
        if ($flag) {              
            echo "<p>文件".$imgSavePath."保存成功</p>";          
        }      
    }  
    ?>

相关推荐:

php使用snoopy与curl模拟登陆的实例分享

php数据抓取类Snoopy使用

snoopy(强大的PHP采集类) 详细介绍

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn