PHP_PHPチュートリアルでのデータ収集の詳細な説明

WBOY
リリース: 2016-07-21 15:10:33
オリジナル
1435 人が閲覧しました

ここでは、PHP 収集に使用できる 2 つの優れたツールを紹介します。 1 つはスヌーピー、もう 1 つは simple_html_dom です。収集する方法は多数あります (実際には、本質的には 2 ~ 3 つだけで、残りは派生です)。PHP には、直接収集するために使用できるいくつかのメソッドが付属しています。でも、怠惰を最後まで貫く精神で。これら 2 つのツールを引き続き使用して、収集を容易にすることができます。

インターネット上にはスヌーピーの紹介がたくさんあります。以下は他の人が翻訳したスヌーピーのSDKです
//////////////////// //// ///////////////////////////////////
Snoopy はブラウザをシミュレートするために使用される PHP クラスですWebコンテンツの取得や送信フォームなどの機能が利用できます。
スヌーピーのいくつかの機能:
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 の受け渡しをサポートします
PHP 4 以降が必要です PHP クラスであるため、これはありません。サーバーを拡張する必要があります。curl をサポートする場合の最良の選択は、
クラス メソッド:
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 タグとその他の無関係なデータを削除し、Web のみを返すことです。ログイン後のページ。
submitlinks($URI)
——————-
このメソッドは submit() と似ていますが、唯一の違いは、このメソッドが HTML タグやその他の無関係なデータを削除し、Web ページ内のリンクのみを返すことです。
デフォルトでは、相対リンクは自動的に完成され、完全な URL に変換されます。
クラス属性: (デフォルト値は括弧内にあります)
$host 接続するホスト
$port 接続するポート
$proxy_host 使用するプロキシ ホスト (存在する場合)
$proxy_port プロキシ ホスト使用するポート (存在する場合)
$agent ユーザー エージェント カモフラージュ (Snoopy v0.1)
$リファラー ソース情報 (存在する場合)
$cookies クッキー (存在する場合)
$rawheaders その他のヘッダー情報 (存在する場合)
$maxredirs リダイレクトの最大数, 0=許可されません (5)
$offsiteok オフサイトへのリダイレクトを許可するかどうか (true)
$expandlinks 完全なアドレスへのすべてのリンクを完了するかどうか (true)
$user 認証ユーザー名、ある場合は、
$pass 認証ユーザー名 (1 つの場合)
$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 サーバーは次のことができます。 write 一時ファイルディレクトリ (/tmp) を入力します
$curl_path cURL バイナリディレクトリがない場合は false に設定します
以下はデモです

コードをコピーします以下の通り:

include "Snoopy.class.php";
$snoopy = new Snoopy;
$snoopy->proxy_host = "www.7767.cn";
$snoopy->proxy_port = "8080";
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
$snoopy->referer = "http://www.7767.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.7767.cn"))
{
   echo "
".htmlspecialchars($snoopy->results)."
\n";
}
else
echo "error fetching document: ".$snoopy->error."\n";

//////////////////////////////////////////////////////////////
Snoopy的特点是“大”和“全”,一个fetch什么都采到了,可以作为采集的第一步。接下来就需要用simple_html_dom来细细的把想要的部分,扣出来。当然,如果你特别特别擅长正则,而且又钟爱正则,你也可以用正则去匹配抓取。

simple_html_dom其实是一个dom解析的过程。php内部也提供了一些解析的方法,但是这个simple_html_dom可以说做得比较专业,一个类,满足了很多你想要的功能。
////////////////////////////////////////////////////////////////
// 用一个URL或文件名,创建一个目标文档对象 ,也就是目标网页
$html = file_get_html ('http://www.7767.cn/' );
//$html = file_get_html ('test.htm' );
//用一个字符串作为一个目标网页。你可以通过Snoopy获取页面,然后再拿到这里来处理
$myhtml = str_get_html ('Hello!' );
// 找到所有的图片,返回的是数组
foreach($html->find ('img' ) as $element)
       echo $element->src . '
' ;
// 找到所有的链接
foreach($html->find ('a' ) as $element)
       echo $element->href . '
' ;

find方法很好用,通常它返回的是一个包含对象的数组。查找目标元素的时候可以通过class或者id,或者其他属性获取目标字符串。

//通过目标div的class属性,查找div,find方法中第二个参数是返回的那个数组中的第几个。从0开始是第一个
$target_div = $html->find ('div.targetclass',0 );
//查看结果是否是你想要的,直接echo就可以了
echo  $target_div;

//比较关键的一点是,这个采集对象创建完后,一定要销毁掉,否则php页面有可能会“卡”上30秒左右,这个取决于你服务器的那个时间限制。销毁的方法是:
$html->clear();
unset($html);
本人认为simple_html_dom比较优秀的地方就是,把采集控制得像JS一样容易。在下面提供的下载包中有英文的手册
simplehtmldom_1_11/simplehtmldom/manual/manual.htm
array
$e->getAllAttributes ()
array
$e->attr
string
$e->getAttribute ( $name )
string
$e->attribute
void
$e->setAttribute ( $name, $value )
void
$value = $e->attribute
bool
$e->hasAttribute ( $name )
bool
isset($e->attribute )
void
$e->removeAttribute ( $name )
void
$e->attribute = null
element
$e->getElementById ( $id )
mixed
$e->find ( "#$id", 0 )
mixed
$e->getElementsById ( $id [,$index] )
mixed
$e->find ( "#$id" [, int $index] )
element
$e->getElementByTagName ($name )
混合
$e->find ( $name, 0 )
混合
$e->getElementsByTagName ( $name [, $index] )
混合
$e->find ( $name [, int $index] )
要素
$e->parentNode()
要素
$e->親()
混合
$e->childNodes ( [$index] )
混合
$e->子供たち ( [int $index] )
要素
$e->firstChild ()
要素
$e->first_child ()
要素
$e->lastChild()
要素
$e->last_child ()
要素
$e->次の兄弟 ()
要素
$e->next_sibling ()
要素
$e->前兄弟 ()
要素
$e->prev_sibling ()

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327082.html技術記事ここでは、php が利用できる優れたツールを 2 つ紹介します。1 つは Snoopy、もう 1 つは simple_html_dom です。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート