4

単純なWebクローラーを最適化しています(現在はPHP / curl_multiを使用しています)。

目標は、スマートであり、HTML以外のコンテンツをスキップしながら、Webサイト全体をクロールすることです。誰も使用せず、HEADリクエストのみを送信しようとしましたが、すべてのWebサイトで機能するわけではないようです(一部のサーバーはHEADをサポートしていません)。そのため、execが長時間(ページ自体をロードするよりもはるかに長く)一時停止します。

コンテンツ全体をダウンロードせずにページタイプを取得したり、ファイルがhtmlでない場合にCURLにダウンロードを強制的に中止させたりする他の方法はありますか?

(自分のhttpクライアントを作成することはできません。後で、CURL関数をCookieおよびSSLとして使用する予定です)。

4

4 に答える 4

1

試したことはありませんが、わかりCURLOPT_PROGRESSFUNCTIONます。ダウンロードされているものに興味がない場合は、応答を徐々に読んでcontent-typeヘッダーを探し、おそらくハンドルをcurl_close ()することができると思います。

CURLOPT_PROGRESSFUNCTION     The name of a callback function
where the callback function takes three parameters. The first is the
cURL resource, the second is a file-descriptor resource, and the 
third is length. Return the string containing the data.

http://www.php.net/manual/en/function.curl-setopt.php

于 2012-08-24T00:56:32.347 に答える
1

これを行う正しい方法は、を使用することです

curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'curlHeaderCallback');

コールバックは2つのパラメーター(最初のCURLハンドル、2番目のヘッダー)を受け入れます。新しいヘッダーが到着するたびに呼び出されます。

$acceptable=array('application/xhtml+xml',
'application/xml', 'text/plain',
'text/xml', 'text/html');

function curlHeaderCallback($resURL, $strHeader) { 
    global $acceptable;
    if (stripos($strHeader,'content-type')===0) {
        $type=strtolower(trim(array_shift(explode(';',array_pop(explode(':',$strHeader))))));
        if (!in_array($type,$acceptable))
            return 0;
    }
    return strlen($strHeader); 

}

于 2012-08-25T15:14:18.640 に答える
0

fsockopenを見たことがありますか?

リモートページへのソケットを開いて、必要なものだけを読み込むことができます。Content-Typeヘッダーを特定したら、接続を閉じることができます。

<?php
$type = 'Unknown';
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);

    $in = '';
    while (!feof($fp)) {
        $in .= fgets($fp, 128);
        if ( preg_match( '/Content-Type: (.+)\n/i', $in, &$matches ) ) {
            $type = $matches[1];
            break;
        }
    }
    fclose($fp);
}
echo $type;
?>
于 2012-08-24T00:48:06.017 に答える
0

これは私のために働いた:

<?php
$handle = curl_init('http://www.google.com');
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_HEADER, true);
$result = curl_exec($handle);
$type = curl_getinfo($handle, CURLINFO_CONTENT_TYPE);
if(strpos($type, 'text/html') !== false) {
    echo 'The URL is an HTML page.';
}
?>
于 2012-08-24T01:54:53.627 に答える