2012-05-05 11 views
3

私はこれが可能であることを願ってインターネットを探していましたが、基本的にはウェブページのタイトルだけを取得する必要があります。彼らはそれらをexaminining前にページをロードする必要があるためページのタイトルのみをクロールする

ウェブクローラは、タスクを実行するに長い時間がかかることがあり、これは私が達成しようとしています何のために非効率的である...ここでは、これまで私が持っているものだ

PHPコード

$url = 'http://www.ebay.com/itm/300702997750#ht_500wt_1156'; 
$str = file_get_contents($url); 
$title = ''; 

if(strlen($str)>0){ 
    preg_match("/\<title\>(.*)\<\/title\>/",$str,$titleArr); 
    $title = $titleArr[1]; 
} 

ページの一部(たとえば、ページの最初の2000文字)をクロールすることができるかどうかを知りたいと思います。

ありがとうございます、ありがとうございます。

+0

これはほとんどが悪いニュースになるでしょう。しかし、 "curl_multi"を使用すると、一度に複数の接続を実行できます。完了すると、解析し、キューから新しいURLを取得してダウンロードを開始します。 – DanRedux

+0

また、 "title"($ titleArrのインデックス0)の最初の出現を取得してはいけませんか?現在、2番目のインデックスを取得しています(配列は0から始まることに注意してください)。 – DanRedux

+0

これはまだ悪いニュースです。複数のクロールを実行しても何も高速化されません。 –

答えて

4

あなたは、代わりに、あなただけの最初の500のバイトをダウンロードします

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/'); 
curl_setopt($ch, CURLOPT_RANGE, '0-500'); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 

を使用することができ、ちょうど最初の1000個の文字をつかむためにSUBSTRを使用することができます。私は(http://www.focalstrategy.com/)私のサイト上でそれを実行すると、私が手

$url = 'http://www.example.com/'; 
$range = array(); 
$repeats = 10; 

function average($a){ 
    return array_sum($a)/count($a) ; 
} 

for ($i=0;$i<$repeats;$i++) { 
    $time_start = microtime(true); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RANGE, '0-500'); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $result = curl_exec($ch); 

    $time_end = microtime(true); 
    $time = $time_end - $time_start; 
    curl_close($ch); 
    $range[] = $time; 
} 
echo "With range: average = ".round(average($range),2)." seconds (Min: ".round(min($range),2).", Max: ".round(max($range),2).")\n"; 

$range = array(); 

for ($i=0;$i<$repeats;$i++) { 
    $time_start = microtime(true); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $result = curl_exec($ch); 

    $time_end = microtime(true); 
    $time = $time_end - $time_start; 
    curl_close($ch); 
    $range[] = $time; 
} 
echo "Without range: average = ".round(average($range),2)." seconds (Min: ".round(min($range),2).", Max: ".round(max($range),2).")\n"; 

:あなたは、この非常に醜いゴミのようなコードを実行して、ベンチできるhttp://en.wikipedia.org/wiki/PHPに対する

With range: average = 0.38 seconds (Min: 0.35, Max: 0.41) 
Without range: average = 0.56 seconds (Min: 0.53, Max: 0.7) 

は、私が手:

Stack Overflowに対する
With range: average = 0.11 seconds (Min: 0.05, Max: 0.5) 
Without range: average = 0.48 seconds (Min: 0.34, Max: 0.78) 

私が手:

With range: average = 1.31 seconds (Min: 1.1, Max: 1.46) 
Without range: average = 1.37 seconds (Min: 1.18, Max: 1.7) 

とはeBayに対して私が取得:

With range: average = 1.75 seconds (Min: 1.56, Max: 1.99) 
Without range: average = 1.74 seconds (Min: 1.51, Max: 2.14) 

あなたはSOとeBay範囲要求をサポートしていないことをテストして見ることができます。

要するに、これをサポートするサイトはスピードアップし、そうでないサイトはコード全体を取得します。

+1

ページ全体をロードせずにこれを行うことは可能でしょうか? –

+0

私はその情報を追加しました。 –

+0

私はこれを打つつもりですが、最初にカールを取り付ける必要があります –