ソースコードをフィルタリングしてWebページのデータを取得しようとしています.curl、html get source$html = file_get_html('http://www.exam.com/results/');
など、 Webページのhtmlコンテンツを取得する方法はたくさんあります。
ページの HTML ソース コードを取得する最良の方法は何ですか? それとも、これらすべての方法は同じですか?
ソースコードをフィルタリングしてWebページのデータを取得しようとしています.curl、html get source$html = file_get_html('http://www.exam.com/results/');
など、 Webページのhtmlコンテンツを取得する方法はたくさんあります。
ページの HTML ソース コードを取得する最良の方法は何ですか? それとも、これらすべての方法は同じですか?
curl
必要なものによって異なりますが、は応答をテキストとして返し、 は を返すことfile_get_html
を覚えておくことが重要Simple_HTML_DOM
です。また、ボンネットの下でのfile_get_html
呼び出しに注意することも重要だと思います。file_get_contents
個人的には、最初にデータをメモリにロードすることを少し好みます (デバッグしやすいと思います) がcurl_*
、リクエストで何らかのヘッダー (POST 変数またはWWW-Auth
ヘッダーなど) を送信する必要がない限り、一般的には使用しません。他のすべてについては、1行の関数呼び出しが混乱に変わることがわかりました。だから私は一般的に依存していfile_get_contents
ます。
に関してSimple_HTML_DOM
は、PHP ネイティブ コンパイル ライブラリよりも高速になるのではないかと思います。simplexml_load_file
またはを使用してこれらにアクセスできますDomDocument::loadHTMLFile
。
cURL はfile_get_contents($url)
***** よりも優れたパフォーマンスを提供する場合があります。これらのすべての関数が最終的に特定の Web ページのコンテンツを取得するため、cURL を使用したいと思います。唯一の違いはランタイムです。
*ここでベンチマークを含むまともな(ただし正式ではない)証拠を見つけることができます: https://stackoverflow.com/questions/555523/file-get-contents-vs-curl-what-has-better-performance
@itamarが提案したように、cURLははるかに多くの制御を提供します。file_get_contents を使用して設定できないいくつかの項目を設定できます。
また、ヘッダーを取得することもできます。
cURL の使用法はかなり複雑ですが、その見返りは非常に優れています。アドバイスは、関数でラップすることです。私はこれを使用する傾向があります:
protected static function prepare_channel(Request $r) {
$r->channel = curl_init();
$p = array();
foreach ($r->GET as $k => $v) {
$p[] = $k."=".$v;
}
$head = array();
foreach ($r->getHeaders() as $k => $v) {
$head[] = $k.": ".$v;
}
curl_setopt($r->channel, CURLOPT_URL, $r->getURI()."?".implode("&",$p));
curl_setopt($r->channel, CURLOPT_HTTPHEADER, $head);
curl_setopt($r->channel, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($r->channel, CURLOPT_FORBID_REUSE, true);
curl_setopt($r->channel, CURLOPT_RETURNTRANSFER, true);
if (Request::getProxy()) {
curl_setopt($r->channel, CURLOPT_PROXY, Request::getProxy());
}
curl_setopt($r->channel, CURLOPT_HEADER, true);
return $r->channel;
}
これはライブ コードであり、私のRequest
オブジェクトには署名として次のものがあります。
protected $headers = array();
protected $baseURI = "";
public $GET = array();
public $POST = array();
実行$result = curl_exec($r->channel);
すると、ヘッダーと本文が返されます。次に、これでそれらを分割できます。
$header_size = curl_getinfo($r->channel, CURLINFO_HEADER_SIZE);
$headers = substr($result, 0, $header_size);
$body = substr($result, $header_size);
そこからは、 と で好きなことを自由に行うことができ$header
ます$body
。また、curl_getinfo($r->channel) を実行すると、大量の情報を取得できます。
PHP で HTML を解析するには、最初に次の 2 つのことを行うことをお勧めします。
tidy
なマークアップをクリアしますDOMDocument
ます。多くの場合、file_get_contents() で十分です。しかし、特別なリクエストが必要な場合がたくさんあります。
PHP Stream コンテキストの使用: curl が利用できず、リクエストに POST-Data を入れる必要がある場合に使用可能
Curl: HTTP コンテンツを取得するためのスイス アーミー ナイフで、通常は最適に機能します。また、可能であれば curl を使用する必要がある特殊なケースが 1 つあります。リモート ページをフェッチすると、所有するリクエストがブロックされます。この場合、リモート サイトのパフォーマンスに依存します。限られた量のスロットで Apache2 のような Web サーバーを使用している場合、リモート サイトが遅すぎるか到達できない場合、スロットがいっぱいになる可能性があります。このようなケースでサーバーダウンを経験しました。Curl は、リクエストのタイムアウトを設定することで役立ちます。3 秒程度に低く設定するのが最適です。
しかし、最善の方法は、cronjob などで外部コンテンツをフェッチし、それをキャッシュして、キャッシュされたバージョンを使用することです。