4

ソースコードをフィルタリングしてWebページのデータを取得しようとしています.curlhtml get source$html = file_get_html('http://www.exam.com/results/');など、 Webページのhtmlコンテンツを取得する方法はたくさんあります。

ページの HTML ソース コードを取得する最良の方法は何ですか? それとも、これらすべての方法は同じですか?

4

4 に答える 4

2

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

于 2013-04-10T13:05:18.430 に答える
2

cURL はfile_get_contents($url)***** よりも優れたパフォーマンスを提供する場合があります。これらのすべての関数が最終的に特定の Web ページのコンテンツを取得するため、cURL を使用したいと思います。唯一の違いはランタイムです。

*ここでベンチマークを含むまともな(ただし正式ではない)証拠を見つけることができます: https://stackoverflow.com/questions/555523/file-get-contents-vs-curl-what-has-better-performance

于 2013-04-10T13:02:39.683 に答える
1

@itamarが提案したように、cURLははるかに多くの制御を提供します。file_get_contents を使用して設定できないいくつかの項目を設定できます。

  • プロキシの使用
  • ヘッダー
  • Cookie の永続的な保存

また、ヘッダーを取得することもできます。

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ます。
于 2013-04-10T13:10:04.330 に答える
1

多くの場合、file_get_contents() で十分です。しかし、特別なリクエストが必要な場合がたくさんあります。

PHP Stream コンテキストの使用: curl が利用できず、リクエストに POST-Data を入れる必要がある場合に使用可能

Curl: HTTP コンテンツを取得するためのスイス アーミー ナイフで、通常は最適に機能します。また、可能であれば curl を使用する必要がある特殊なケースが 1 つあります。リモート ページをフェッチすると、所有するリクエストがブロックされます。この場合、リモート サイトのパフォーマンスに依存します。限られた量のスロットで Apache2 のような Web サーバーを使用している場合、リモート サイトが遅すぎるか到達できない場合、スロットがいっぱいになる可能性があります。このようなケースでサーバーダウンを経験しました。Curl は、リクエストのタイムアウトを設定することで役立ちます。3 秒程度に低く設定するのが最適です。

しかし、最善の方法は、cronjob などで外部コンテンツをフェッチし、それをキャッシュして、キャッシュされたバージョンを使用することです。

于 2013-04-10T13:10:11.360 に答える