PHP__収集クラス_Snoopy
Snoopy
目次
了解1
機能:...1
ダウンロードSnoopy:...2
Snoopyの一般的な機能...2
1指定urlの内容を取得...2
2フォームの発行...2
3偽装...2
4より多くの情報を偽造...3
クラシックブログ...5
Snoopyについて
Snoopyはphpクラスで、Webブラウザの機能を模倣し、Webコンテンツの取得とフォームの送信のタスクを完了します.
Snoopyの特徴:
*Webページの内容を簡単にキャプチャ
*Webページのテキストを簡単にキャプチャ(HTMLタグを削除)
*Webページへのアクセスが容易
*エージェントホストのサポート
*基本的なユーザー名/パスワードの検証をサポート
*user_の設定をサポートAgent,referer,cookies,header content(ヘッダファイル)
*ブラウザのステアリングをサポートし、ステアリングの深さをコントロールできる
*Webページのリンクを高品質urlに拡張できます(デフォルト)
*データのコミットと戻り値の取得が容易
*HTMLフレームワークの追跡をサポート(v 0.92増加)
*再転向対応時にクッキーを渡す(v 0.92増加)
Snoopyをダウンロード:
http://sourceforge.net/projects/snoopy/
一般的な機能
1.指定urlの内容を取得する
2.フォームの提出
すでに提出されたフォームであれば、いろいろなことができます.次にipを偽装し、ブラウザを偽装します.
3.偽装
偽装できるのか?
session
ブラウザを偽装する
ip
,
haha
いろいろできるようになりました.
例えば、認証コード付き、検証
ip
投票して、止まらずに投票することができます.
ps:
ここに偽装
ip
ああ、実は偽装
http
ヘッド
,
だから普通に
REMOTE_ADDR
取得済み
ip
偽装できないのですが、
逆にそれらは
http
ヘッドを取得
ip
の
(
エージェントを防ぐことができる
)
自分で作ることができる
ip
.
コードの検証方法について簡単に説明します.
まず普通のブラウザで、ページを見て、検証コードに対応する
sessionid
,
同時にメモする
sessionid
検証コードの値、
次は
snoopy
偽造する.
げんり
:
同じだから
sessionid
だから取得した検証コードは初めて入力したものと同じです.
4その他の情報の偽造
時々もっと偽造する必要があるかもしれませんが、snoopyは私たちのために$snoopy->proxy_を完全に考えています.host = "www.pigshu.com"; $snoopy->proxy_port = "8080";//プロキシ$snoopy->maxredirs=2を使用する//リダイレクト回数$snoopy->expandlinks=true;//リンクを補完するかどうかは収集時によく用いられる//例えばリンクが/images/taoavである.gifはその全リンクに変更できますhttp://www.pigshu.com/images/taoav.gifああ、ここは実は最後に出力するときにereg_を使うことができます.replace関数$snoopy->maxframes=5//許容最大フレーム数//フレームをキャプチャするときに$snoopy->resultsが返す配列$snoopy->error//エラーメッセージを返すことに注意
上記の基本的な使い方を理解しました.次に、実例について説明します.
これはPHPCHINAフォーラムへのログインをシミュレートするプロセスで、まず自分のブラウザの情報を表示します:echo var_dump($_SERVER);このコードは自分のブラウザの情報を見ることができて、$SERVER['HTTP_USER_AGENT']の後ろの内容をコピーして$snoopy->agentのところに貼り付けて、それから自分のCOOKIEを見て、自分でフォーラムのアカウントでフォーラムにログインした後、ブラウザのアドレスバーにjavascript:documentと入力します.write(document.cookie)は、車に戻ると、自分のcookie情報が表示され、$snoopy->rawheaders["COOKIE"=の後ろにコピーして貼り付けられます.(私のクッキー情報は安全のために削除されています)そして注意してください.
この2つのコードは、収集されたコンテンツがすべて
HTML
ソースアドレスは相対リンクなので、絶対リンクに置き換えると、フォーラムの画像や
css
スタイルが変わりました.
公式ブログ
次はMeteoricからcryブログ:
http://www.cnblogs.com/meteoric_cry/archive/2011/05/10/2042512.html
使用方法:
1、Snoopyクラスを先にダウンロードし、アドレスをダウンロードする:http://sourceforge.net/projects/snoopy/
2、オブジェクトをインスタンス化し、適切なメソッドを呼び出してキャプチャしたWebページ情報を取得する
例:
Webページのすべてのピクチャアドレスを取得する方法は提供されていません.1つのページのすべての記事リストのピクチャアドレスを取得する必要があります.そして自分で一つ書きましたが、主に正則のマッチングが重要です.
需要が特殊なため、htp://の冒頭の画像を捕まえるだけです(外駅の画像は防犯チェーンを作る可能性がありますが、まず地元に捕まえたいです)
実現構想:
1、指定されたウェブページをキャプチャし、予想されるすべての文章アドレスをフィルタリングする.
2、最初のステップの文章アドレスをループしてキャプチャし、マッチング画像の正規表現を使用してマッチングし、ページ内のルールに合致するすべての画像アドレスを取得する.
3、画像接尾辞とID(ここではgif、jpgのみ)に基づいて画像を保存---この画像ファイルが存在する場合は、削除してから保存する
phpを使ってWebページをキャプチャする:コンテンツ、ピクチャ、リンクの時、私は最も重要なのはやはり正則だと思います(キャプチャしたコンテンツと指定したルールに基づいて欲しいデータを取得します)、構想は実はすべて比較的に簡単で、使う方法も多くなくて、そのいくつか(しかもコンテンツをキャプチャするのはやはり直接他の人の書いたクラスの中の方法を呼び出すだけでいいです)
しかし、phpは、ファイルにN行(Nが大きい)があるなど、ルールに合致する行の内容を置き換える必要がある方法を実装していないようです.例えば、3行目がaaaでbbbbbに変換する必要があります.一般的に、ファイルを変更する必要がある場合の一般的な方法:
1.ファイル全体を一度に(または行単位で)読み込み、最終変換後の結果を一時ファイルで保存して元のファイルに置き換える
2、逐行読み取り、fseekでファイルポインタの位置を制御し、fwrite書き込み
シナリオ1ファイルが大きい場合は、1回の読み取りは不可(行単位で読み取り、一時ファイルに書き込んで元のファイルを置き換える効率も高くない感じ)、シナリオ2は、置き換えられた文字列の長さが目標値以下の場合は問題ありませんが、それを超えると問題があり、「境界を越える」ことになります.次の行のデータも狂ってしまいました(JavaScriptに「選挙区」という概念があるように、新しい内容で置き換えることはできません)
次に、シナリオ2を使用して試験を行うコードを示します.
まず1行を読み出します.このときファイルポインタとは、実は次の行の先頭まで、fseekを使用してファイルポインタを前の行の先頭に戻し、fwriteを使用して置換操作を行います.置換操作なので、長さを指定しない場合は、次の行のデータに影響を与えますが、私が望んでいるのは、この行だけを操作したいということです.たとえば、この行を削除したり、行全体を1つに置き換えたりします.上記の例は要求に達していません.私はまだ適切な方法を見つけていないかもしれません.
目次
了解1
機能:...1
ダウンロードSnoopy:...2
Snoopyの一般的な機能...2
1指定urlの内容を取得...2
2フォームの発行...2
3偽装...2
4より多くの情報を偽造...3
クラシックブログ...5
Snoopyについて
Snoopyはphpクラスで、Webブラウザの機能を模倣し、Webコンテンツの取得とフォームの送信のタスクを完了します.
Snoopyの特徴:
*Webページの内容を簡単にキャプチャ
*Webページのテキストを簡単にキャプチャ(HTMLタグを削除)
*Webページへのアクセスが容易
*エージェントホストのサポート
*基本的なユーザー名/パスワードの検証をサポート
*user_の設定をサポートAgent,referer,cookies,header content(ヘッダファイル)
*ブラウザのステアリングをサポートし、ステアリングの深さをコントロールできる
*Webページのリンクを高品質urlに拡張できます(デフォルト)
*データのコミットと戻り値の取得が容易
*HTMLフレームワークの追跡をサポート(v 0.92増加)
*再転向対応時にクッキーを渡す(v 0.92増加)
Snoopyをダウンロード:
http://sourceforge.net/projects/snoopy/
一般的な機能
1.指定urlの内容を取得する
$url = "http://www.pigshu.com";
include("snoopy.php");
$snoopy = new Snoopy;
$snoopy->fetch($url); //
echo $snoopy->results; //
$snoopy->fetchtext // ( html )
$snoopy->fetchlinks //
$snoopy->fetchform //
2.フォームの提出
<span style="font-size:14px;">$formvars["username"] = "admin";
$formvars["pwd"] = "admin";
$action = "http://www.pigshu.com";//
$snoopy->submit($action,$formvars);//$formvars
echo $snoopy->results; //
$snoopy->submittext; // html
$snoopy->submitlinks;// </span><span style="font-size:24px;">
</span>
すでに提出されたフォームであれば、いろいろなことができます.次にipを偽装し、ブラウザを偽装します.
3.偽装
$formvars["username"] = "admin";
$formvars["pwd"] = "admin";
$action = "http://www.pigshu.com";
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://s.jb51.net"; // 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は私たちのために$snoopy->proxy_を完全に考えています.host = "www.pigshu.com"; $snoopy->proxy_port = "8080";//プロキシ$snoopy->maxredirs=2を使用する//リダイレクト回数$snoopy->expandlinks=true;//リンクを補完するかどうかは収集時によく用いられる//例えばリンクが/images/taoavである.gifはその全リンクに変更できますhttp://www.pigshu.com/images/taoav.gifああ、ここは実は最後に出力するときにereg_を使うことができます.replace関数$snoopy->maxframes=5//許容最大フレーム数//フレームをキャプチャするときに$snoopy->resultsが返す配列$snoopy->error//エラーメッセージを返すことに注意
上記の基本的な使い方を理解しました.次に、実例について説明します.
<?
//echo var_dump($_SERVER);
include("Snoopy.class.php");
$snoopy = new Snoopy;
$snoopy->agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-
CN; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 FirePHP/0.2.1";//
, cookie, (ps:$_SERVER )
$snoopy->referer = "http://www.pigshu.com/index.php";
$snoopy->expandlinks = true;
$snoopy->rawheaders["COOKIE"]="__utmz=17229162.1227682761.29.7.utmccn=(referral)|utmcsr=jb51.net|utmcct=/html/index.html|utmcmd=referral; cdbphpchina_smile=1D2D0D1; cdbphpchina_cookietime=2592000; __utma=233700831.1562900865.1227113506.1229613449.1231233266.16; __utmz=233700831.1231233266.16.8.utmccn=(referral)|utmcsr=localhost:8080|utmcct=/test3.php|utmcmd=referral; __utma=17229162.1877703507.1227113568.1231228465.1231233160.58; uchome_loginuser=sinopf; xscdb_cookietime=2592000; __utmc=17229162; __utmb=17229162; cdbphpchina_sid=EX5w1V; __utmc=233700831; cdbphpchina_visitedfid=17; cdbphpchinaO766uPYGK6OWZaYlvHSuzJIP22VpwEMGnPQAuWCFL9Fd6CHp2e%2FKw0x4bKz0N9lGk; xscdb_auth=8106rAyhKpQL49eMs%2FyhLBf3C6ClZ%2B2idSk4bExJwbQr%2BHSZrVKgqPOttHVr%2B6KLPg3DtWpTMUI4ttqNNVpukUj6ElM; cdbphpchina_onlineusernum=3721";
$snoopy->fetch("http://www.pigshu.com");
$n=ereg_replace("href="","href="http://www.pigshu.com/",$snoopy->results );
echo ereg_replace("src="","src="http://www.pigshu.com/",$n);
?>
これはPHPCHINAフォーラムへのログインをシミュレートするプロセスで、まず自分のブラウザの情報を表示します:echo var_dump($_SERVER);このコードは自分のブラウザの情報を見ることができて、$SERVER['HTTP_USER_AGENT']の後ろの内容をコピーして$snoopy->agentのところに貼り付けて、それから自分のCOOKIEを見て、自分でフォーラムのアカウントでフォーラムにログインした後、ブラウザのアドレスバーにjavascript:documentと入力します.write(document.cookie)は、車に戻ると、自分のcookie情報が表示され、$snoopy->rawheaders["COOKIE"=の後ろにコピーして貼り付けられます.(私のクッキー情報は安全のために削除されています)そして注意してください.
# $n=ereg_replace("href="","href="http://www.pigshu.com/",$snoopy->results );
# echo ereg_replace("src="","src="http://www.pigshu.com/",$n);
この2つのコードは、収集されたコンテンツがすべて
HTML
ソースアドレスは相対リンクなので、絶対リンクに置き換えると、フォーラムの画像や
css
スタイルが変わりました.
公式ブログ
次はMeteoricからcryブログ:
http://www.cnblogs.com/meteoric_cry/archive/2011/05/10/2042512.html
使用方法:
1、Snoopyクラスを先にダウンロードし、アドレスをダウンロードする:http://sourceforge.net/projects/snoopy/
2、オブジェクトをインスタンス化し、適切なメソッドを呼び出してキャプチャしたWebページ情報を取得する
例:
include'snoopy/Snoopy.class.php';
$snoopy = new Snoopy();
$sourceURL = "http://xxxxxxxxx";
$snoopy->fetchlinks($sourceURL);
$a = $snoopy->results;
Webページのすべてのピクチャアドレスを取得する方法は提供されていません.1つのページのすべての記事リストのピクチャアドレスを取得する必要があります.そして自分で一つ書きましたが、主に正則のマッチングが重要です.
//
$reTag = "/<img[^s]+src=\"(http:\/\/[^\"]+).(jpg|png|gif|jpeg)\"[^\/]*\/>/i";
需要が特殊なため、htp://の冒頭の画像を捕まえるだけです(外駅の画像は防犯チェーンを作る可能性がありますが、まず地元に捕まえたいです)
実現構想:
1、指定されたウェブページをキャプチャし、予想されるすべての文章アドレスをフィルタリングする.
2、最初のステップの文章アドレスをループしてキャプチャし、マッチング画像の正規表現を使用してマッチングし、ページ内のルールに合致するすべての画像アドレスを取得する.
3、画像接尾辞とID(ここではgif、jpgのみ)に基づいて画像を保存---この画像ファイルが存在する場合は、削除してから保存する
<meta http-equiv='content-type' content='text/html;charset=utf-8'>
<?php
include'snoopy/Snoopy.class.php';
$snoopy = new Snoopy();
$sourceURL = "http://xxxxx";
$snoopy->fetchlinks($sourceURL);
$a = $snoopy->results;
$re = "/\d+\.html$/";
//
foreach ($a as $tmp) {
if (preg_match($re, $tmp)) {
getImgURL($tmp);
}
}
functiongetImgURL($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]);
}
}
}
functionsaveImgURL($name, $suffix) {
$url = $name.".".$suffix;
echo" :".$url."<br/>";
$imgSavePath = "E:/xxx/style/images/";
$imgId = preg_replace("/^.+\/(\d+)$/", "\\1", $name);
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>";
}
}
?>
phpを使ってWebページをキャプチャする:コンテンツ、ピクチャ、リンクの時、私は最も重要なのはやはり正則だと思います(キャプチャしたコンテンツと指定したルールに基づいて欲しいデータを取得します)、構想は実はすべて比較的に簡単で、使う方法も多くなくて、そのいくつか(しかもコンテンツをキャプチャするのはやはり直接他の人の書いたクラスの中の方法を呼び出すだけでいいです)
しかし、phpは、ファイルにN行(Nが大きい)があるなど、ルールに合致する行の内容を置き換える必要がある方法を実装していないようです.例えば、3行目がaaaでbbbbbに変換する必要があります.一般的に、ファイルを変更する必要がある場合の一般的な方法:
1.ファイル全体を一度に(または行単位で)読み込み、最終変換後の結果を一時ファイルで保存して元のファイルに置き換える
2、逐行読み取り、fseekでファイルポインタの位置を制御し、fwrite書き込み
シナリオ1ファイルが大きい場合は、1回の読み取りは不可(行単位で読み取り、一時ファイルに書き込んで元のファイルを置き換える効率も高くない感じ)、シナリオ2は、置き換えられた文字列の長さが目標値以下の場合は問題ありませんが、それを超えると問題があり、「境界を越える」ことになります.次の行のデータも狂ってしまいました(JavaScriptに「選挙区」という概念があるように、新しい内容で置き換えることはできません)
次に、シナリオ2を使用して試験を行うコードを示します.
<?php
$mode = "r+";
$filename = "d:/file.txt";
$fp = fopen($filename, $mode);
if ($fp) {
$i = 1;
while (!feof($fp)) {
$str = fgets($fp);
echo $str;
if ($i == 1) {
$len = strlen($str);
fseek($fp, -$len, SEEK_CUR);//
fwrite($fp, "123");
}
$i++;
}
fclose($fp);
}
?>
まず1行を読み出します.このときファイルポインタとは、実は次の行の先頭まで、fseekを使用してファイルポインタを前の行の先頭に戻し、fwriteを使用して置換操作を行います.置換操作なので、長さを指定しない場合は、次の行のデータに影響を与えますが、私が望んでいるのは、この行だけを操作したいということです.たとえば、この行を削除したり、行全体を1つに置き換えたりします.上記の例は要求に達していません.私はまだ適切な方法を見つけていないかもしれません.