2011-08-11 1 views
4

次のPHPスクリプトを使用して、特定のページのすべてのリンクを取得しますが、ウェブサイト全体のすべてのリンクを取得しようとしています。cURLを使用してウェブサイト内のすべてのリンクを取得する(ページだけでなく)

<?php 

    function urlLooper($url){ 

     $urlArray = array(); 

     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $result = curl_exec($ch); 

     $regex='|<a.*?href="(.*?)"|'; 
     preg_match_all($regex,$result,$parts); 
     $links=$parts[1]; 
     foreach($links as $link){ 
      array_push($urlArray, $link); 
     } 
     curl_close($ch); 

     foreach($urlArray as $value){ 
      echo $value . '<br />'; 
     } 
    } 

    $url = 'http://www.justfundraising.com/'; 
    urlLooper($url); 

?>

ウェブサイト上のすべてのリンクを取得するにはcURL(または率直に言って、他の方法)を使用する方法はありますか?私はあなたが不思議に思っている場合に備えてサーバーにアクセスできます。

私の考えは、ホームページからすべてのリンクを生成してから、それらのリンクを同じ関数に渡して、重複を無視してリンクの新しいリストを取得することでした。私はそのようにしてすべてのページを手に入れます。

ご協力いただければ幸いです!

+0

あなたはページの取得と解析が容易になり、 'phpQuery'を調査することができ、手動で未満面倒な簡単なクモを構築することができますカールとテキスト抽出のアプローチ。 – mario

+0

あなたのスクリプトはちょうど私を大いに助けました、thankyou =) – RayZor

+0

私は[this](http://blog.viktorkelemen.com/2011/07/get-links-from-page-with-bash.html)を使いました。それが助けになるかどうかは分かりません。 –

答えて

1

curlは、あなたがそれを伝えるものだけを取り出します。あなたのために内容を解析せず、内容によって参照される「外部」リソースを再帰的に取得しません。返されたHTMLの中で自分自身を見つけ出し、画像/スクリプトのリンクを解析し、より多くのカールコールを使用してそれらを取得する必要があります。

つまり、wgetを使用すると、wgetを複製する必要があります。

3

@marioはおそらくphpQuery(http://code.google.com/p/phpquery/)を使用しています。ライブラリをダウンロードしてページに追加したら、渡す文字列からすべてのリンクを含む配列を取得する方法を示すコード例を示します(newDocument関数の文字列を例):

$links = phpQuery::newDocument('<a href="test1.html">Test 1</a><a href="test2.html">Test 2</a><a href="test3.html">Test 3</a>')->find('a'); 
$array_links = array(); 
foreach($links as $r) { 
    $array_links[] = pq($r)->attr('href'); 
} 
die("<pre>".print_r($array_links,true)."</pre>"); 

上記のコードは返されます:

Array 
(
    [0] => test1.html 
    [1] => test2.html 
    [2] => test3.html 
) 

は、この情報がお役に立てば幸いです。

1

私はsimplehtmldomを使って同じことを試みていました。コードはしばらくしてからクラッシュしました。実際には、ここでdfsメソッドを使用しようとしていましたが、これはある時点でスタックをオーバーフローさせる可能性があります。

あなたがここにcURLの

を使用して、この方法を確認することができますが、私のコードです:

<?php 
traverse($home,0); 

function traverse($url,$depth) 
{ 
if($depth>1)return; 
$html = file_get_html($url); 
foreach($html->find('a') as $element) 
{ 
    $nurl = $element->href; 
    echo $nurl."<br>"; 
    traverse($nurl,$depth+1); 

} 
} 
?> 
関連する問題