ホームページ  >  記事  >  バックエンド開発  >  PHPデータ取得クラスSnoopyの使用

PHPデータ取得クラスSnoopyの使用

巴扎黑
巴扎黑オリジナル
2016-11-22 16:38:421560ブラウズ

PHPコレクション スヌーピー 詳細説明
PHPコレクションツール スヌーピーアプリケーション 詳細説明
スヌーピーは、ブラウザの機能をシミュレートするために使用され、Webコンテンツの取得やフォームの送信ができるPHPクラスです。 Snoopy を正しく動作させるには、サーバーの PHP バージョンが 4 以降であり、基本的な LAMP サービスでサポートされる PCRE (Perl 互換正規表現) をサポートしている必要があります。
1. スヌーピーのいくつかの機能:
1. Web ページのコンテンツを取得します fetch
2. Web ページのテキストコンテンツを取得します (HTML タグを削除します) fetchtext
3. Web ページのリンクを取得し、fetchlinks fetchform を作成します
4. プロキシホストをサポートします
5. 基本的なユーザー名/パスワード検証をサポートします
6. user_agent、リファラー(ソース)、Cookie、ヘッダーコンテンツ(ヘッダーファイル)の設定​​をサポートします
7. ブラウザーのリダイレクトをサポートし、リダイレクトの深さを制御します
8. できるWeb ページ内のリンクを高品質の URL に展開します (デフォルト)
9. データを送信して戻り値を取得します
10. HTML フレームワークの追跡をサポートします
11. リダイレクト時の Cookie の受け渡しをサポートします。PHP4 以降が必要です。 PHP クラスなので拡張する必要はありません。サーバーがcurlをサポートしていない場合に最適です。
2. クラスメソッド:
fetch($URI)
————–
Webページのコンテンツをキャプチャするために使用されるメソッドです。 $URI パラメータは、クロールされた Web ページの URL アドレスです。取得した結果は $this->results に保存されます。フレームをスクレイピングしている場合、スヌーピーは各フレームを追跡して配列に保存し、$this->results に保存します。
fetchtext($URI)
——————
このメソッドは fetch() に似ていますが、唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページ内のテキスト コンテンツのみを返すことです。
fetchform($URI)
——————
このメソッドは fetch() に似ていますが、唯一の違いは、このメソッドが HTML タグとその他の無関係なデータを削除し、フォームのコンテンツ (フォーム) のみを返すことです。ウェブページ。
fetchlinks($URI)
————-
このメソッドは fetch() に似ていますが、唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページ内のリンクのみを返すことです。
デフォルトでは、相対リンクは自動的に完成され、完全な URL に変換されます。
submit($URI,$formvars)
——————-
このメソッドは、$URLで指定されたリンクアドレスに確認フォームを送信します。 $formvars はフォームパラメータを格納する配列です。
submittext($URI,$formvars)
————————–
このメソッドは submit() に似ていますが、唯一の違いは、このメソッドが HTML タグとその他の無関係なデータを削除し、ページのみを返すことです。ログイン後のテキストコンテンツ。
submitlinks($URI)
————-
このメソッドは submit() と似ていますが、唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページ内のリンクのみを返すことです。
デフォルトでは、相対リンクは自動的に完成され、完全な URL に変換されます。
3. クラス属性: (括弧内はデフォルト値)
$host 接続されているホスト
$port 接続されているポート
$proxy_host 使用されるプロキシ ホスト (存在する場合)
$proxy_port 使用されるプロキシ ホスト ポート (存在する場合)
$agentユーザー エージェント カモフラージュ (Snoopy v0.1)
$referer ソース情報 (存在する場合)
$cookies Cookie (存在する場合)
$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 に設定します。
4. 以下はデモです
$snoopy = new Snoopy- >proxy_host = "www .baidu.com";
$snoopy->proxy_port = "8080";
$snoopy->agent = "(互換性; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
$snoopy->リファラー = "http://www.baidu.com/";
$snoopy->cookies["セッションID"] = 238472834723489l;$snoopy->cookies["favoriteColor"] = "RED"; 
$snoopy->rawheaders["Pragma"] = "キャッシュなし"; 
$snoopy->maxredirs = 2; 
$snoopy->オフサイトok = false; 
$snoopy->expandlinks = false; 
$スヌーピー->ユーザー = "ジョー"; 
$snoopy->pass = "ブルー"; 
if($snoopy->fetchtext("http://www.baidu.com"))
{
echo "

".htmlspecialchars($snoopy->results)." 
ん";
 
}
 
それ以外
 
echo "ドキュメントの取得中にエラーが発生しました: ".$snoopy->error."n"; 
snoopy采集phpchina例
//采集phpchina
set_time_limit(0); 
require_once("スヌーピー.クラス.php"); 
$snoopy=新しいスヌーピー(); 
//登陆论坛
$submit_url = "http://www.phpchina.com/bbs/logging.php?action=login"; 
$submit_vars["ログインモード"] = "通常"; 
$submit_vars["styleid"] = "1"; 
$submit_vars["cookietime"] = "315360000"; 
$submit_vars["ログインフィールド"] = "ユーザー名"; 
$submit_vars["ユーザー名"] = "***"; //你的用户名
$submit_vars["password"] = "*****"; //你的密码
$submit_vars["questionid"] = "0"; 
$submit_vars["answer"] = ""; 
$submit_vars["loginsubmit"] = "提交"; 
$snoopy->submit($submit_url,$submit_vars); 
if ($snoopy->results)
{
//获取连地上址
$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]=$pvalue; 
$m++; 
}
}
$j++; 
}
//去除重复项开開始
//$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=array(); 
$content=array(); 
$temp=''; 
$tt=配列(); 
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 "タイトルなし";
終了;
}
else
{
$title[$u]=$tt[1] [ 1];
}
unset($tt);
//コンテンツを読む
if (!preg_match_all("/
(.*)
/i",$temp,$tt))
{
print_r($tt);
echo "no content1";
exit;
}
else
{
foreach ( $tt [1] as $c=>$c2)
{
$content[$u].=$c2;
}
}
}
else
{
// ページのコンテンツを直接取得する
$snoopy = new Snoopy();
$snoopy->fetch($value);
$temp=$snoopy->results;
//タイトルを読む
if (!preg_match_all("/

(.* ) <) ;/h2>/i",$temp,$tt))
{
echo "タイトルなし";
終了;
}
else
{
$title[$u]=$tt[1][1 ];
}
unset($tt);
//コンテンツを読む
if (!preg_match_all("/
(.*) /i",$temp,$tt))
{
echo "no content2";
exit;
}
else
{
foreach ($tt[1] as $c=>$c2 )
{
$content[$u].=$c2;
}
}
}
$u++;
print_r($content);
else
{
echo "ログインに失敗しました";
終了;
}
?>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

前の記事:PHPカール次の記事:PHPカール