2011-08-11 84 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); 

?>

有没有办法使用卷曲(或者坦白任何其他方法)来获取网站上的所有链接?如果您想知道,我可以访问服务器。

我的想法是从主页生成所有链接,然后通过相同的函数传回这些链接,以获得忽略任何重复链接的新链接列表。我以这种方式得到所有的页面。

任何帮助将不胜感激!

+0

你可以调查'phpQuery'从而简化了页面的检索和分析,从而构建一个简单的蜘蛛比手动不太繁琐卷曲和文本提取方法。 – mario

+0

上面的脚本刚刚帮了我很大的忙,谢谢=) – RayZor

+0

我用[this](http://blog.viktorkelemen.com/2011/07/get-links-from-page-with-bash.html);不知道它是否会有所帮助。 –

回答

1

curl只提取您告诉它的内容。它不会为你分析内容,也不会递归地获取内容引用的“外部”资源。您必须自己翻阅返回的HTML,解析出图像/脚本链接,并使用更多的curl调用来获取这些。

换句话说,你将不得不复制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方法,它可以在一个点上溢出堆栈。

您可以使用该检查方法卷曲

这里是我的代码:

<?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); 

} 
} 
?> 
相关问题