PHP のクローリングとコレクション クラスの概要 snoopy_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:33:11
オリジナル
650 人が閲覧しました

snoopy は、Web ブラウザーの機能を模倣するために使用される php クラスで、Web コンテンツの取得とフォームの送信のタスクを完了できます。公式サイト http://snoopy.sourceforge.net/

スヌーピーのいくつかの特徴:

  • Web ページのコンテンツを取得する fetch()
  • Web ページのテキストコンテンツを取得します (HTML タグを削除します) fetchtext()
  • Web ページのリンクを取得し、 fetchlinks() fetchform() を作成します
  • プロキシホストをサポート
  • 基本的なユーザー名/パスワードの検証をサポートします
  • user_agent、リファラー(ソース)、Cookie、ヘッダーコンテンツ(ヘッダーファイル)の設定​​をサポート
  • ブラウザのリダイレクトをサポートし、リダイレクトの深さを制御できます
  • Web ページ内のリンクを高品質の URL に展開できます (デフォルト)
  • データを送信して戻り値を取得する
  • 追跡HTMLフレームワークをサポート
  • リダイレクト時の Cookie の受け渡しをサポート

php4以降が必要です。 PHP クラスであるため、サポートを拡張する必要はありません。サーバーがcurlをサポートしていない場合に最適です。

クラスメソッド

1.フェッチ($uri)

これは、Web ページのコンテンツをクロールするために使用される方法です。 $URI パラメータは、クロールされた Web ページの URL アドレスです。取得した結果は $this->results に保存されます。

フレームをスクレイピングしている場合、スヌーピーは各フレームを追跡して配列に保存し、$this->results に保存します。

リーリー

2. フェッチテキスト($URI)

このメソッドは fetch() に似ています。唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページ内のテキスト コンテンツのみを返すことです。

リーリー

3. フェッチフォーム($URI)

このメソッドは fetch() に似ていますが、唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページのフォーム コンテンツ (フォーム) のみを返すことです。

リーリー

4. リンクの取得($URI)

このメソッドは fetch() に似ていますが、唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページ内のリンクのみを返すことです。デフォルトでは、相対リンクは自動的に完成され、完全な URL に変換されます。

リーリー

5. 送信($URI,$formvars)

このメソッドは、$URL で指定されたリンク アドレスに確認フォームを送信します。 $formvars はフォームパラメータを格納する配列です。

リーリー

6. 送信テキスト($URI,$formvars)

このメソッドは submit() に似ていますが、唯一の違いは、このメソッドは HTML タグやその他の無関係なデータを削除し、ログイン後に Web ページ内のテキスト コンテンツのみを返すことです。

リーリー

7.リンクの送信($URI)

このメソッドは submit() に似ていますが、唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページ内のリンクのみを返すことです。デフォルトでは、相対リンクは自動的に完成され、完全な URL に変換されます。

リーリー

クラス属性 (デフォルト値は括弧内にあります)

  • $host 接続されているホスト
  • $port 接続するポート
  • $proxy_host 使用されるプロキシ ホスト (存在する場合)
  • $proxy_port 使用されるプロキシ ホスト ポート (存在する場合)
  • $agent ユーザーエージェント変装 (スヌーピー v0.1)
  • $リファラールーティング情報(利用可能な場合)
  • $cookies クッキー (ある場合)
  • $rawheaders その他のヘッダー情報 (ある場合)
  • $maxredirs リダイレクトの最大数、0=許可されません (5)
  • $offsiteok オフサイトへのリダイレクトを許可するかどうか (true)
  • $expandlinks 完全なアドレスへのすべてのリンクを完了するかどうか (true)
  • $user 認証のユーザー名 (利用可能な場合)
  • $pass 認証ユーザー名 (可能な場合)
  • $accept http 受け入れタイプ (image/gif、image/x-xbitmap、image/jpeg、image/pjpeg、*/*)
  • $error エラーがある場合、どこに報告されますか
  • $response_code サーバーから返されたレスポンス コード
  • $headers サーバーから返されたヘッダー情報
  • $maxlength 返されるデータの最長長
  • $read_timeout 読み取り操作のタイムアウト (PHP 4 Beta 4+ が必要)、タイムアウトなしの場合は 0 に設定します
  • $timed_out 読み取り操作がタイムアウトすると、この属性は true を返します (PHP 4 Beta 4+ が必要)
  • $maxframes 追跡できる最大フレーム数
  • $status キャプチャされた http
  • のステータス
  • $temp_dir Web サーバーが書き込むことができる一時ファイル ディレクトリ (/tmp)
  • $curl_path cURL バイナリ ディレクトリ。cURL バイナリがない場合は false に設定します

デモ

リーリー

指定された URL コンテンツを取得します:

リーリー

フォーム送信:

リーリー

フォームが送信されたので、さまざまなことができるようになります。次に、IP とブラウザを偽装しましょう:

リーリー

セッションを偽装したり、ブラウザを偽装したり、IP を偽装したりできることがわかりました。笑、たくさんのことができます。たとえば、確認コードを持参して IP を確認して投票すると、ノンストップで投票できます。

追記: ここでの IP の偽装は、実際には http ヘッダーの偽装であるため、REMOTE_ADDR を通じて取得した IP は偽装できません。逆に、http ヘッダー (プロキシを防止できる種類) を通じて IP を取得した人は、独自の IP を作成できます。 。

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

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

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

<?php
$snoopy->proxy_host = "http://www.bkjia.com/librarys/veda/";
$snoopy->proxy_port = "8080"; //使用代理
$snoopy->maxredirs = 2; //重定向次数
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
// 例如链接为 /images/taoav.gif 可改为它的全链接 http://www.4wei.cn/images/taoav.gif
$snoopy->maxframes = 5 //允许的最大框架数
//注意抓取框架的时候 $snoopy->results 返回的是一个数组
$snoopy->error //返回报错信息
?>
ログイン後にコピー

比较完整的示例:

/**
* 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"] = '238472834723489';
$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类完成一个简单的图片采集:

<meta http-equiv='content-type' content='text/html;charset=utf-8'>
<?php    
include 'Snoopy.class.php';   //加载Snoopy类     
$snoopy = new Snoopy();       //实例化一个对象
$sourceURL = "http://www.bkjia.com/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='color:#f00;'>文件".$imgSavePath."已存在,将被删除</p>";        
 	}  
 	$imgFile = file_get_contents($url); //读取网络文件     
 	$flag = file_put_contents($imgSavePath,$imgFile);   //写入到本地 
 	if ($flag) {            
  		echo "<p>文件".$imgSavePath."保存成功</p>";        
 	}    
}
?>
ログイン後にコピー

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752536.htmlTechArticlesnoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。官方网站 http://snoopy.sourceforge.net/ Snoopy的一些功能...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート