我使用以下PHP脚本获取给定页面上的所有链接,但我试图在整个网站上获取所有链接。
<?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);
&GT;
有没有办法使用cURL(或任何其他方法坦率地)获取网站上的所有链接?如果你想知道我可以访问服务器。
我的想法是从主页生成所有链接,然后通过相同的函数传回这些链接,以获取新的链接列表,忽略任何重复。我想这样我会得到所有的页面。
任何帮助将不胜感激!
答案 0 :(得分: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 :(得分:1)
curl只取你告诉它的东西。它不会为您解析内容,也不会递归地获取内容引用的“外部”资源。你必须自己在返回的HTML中翻找,解析图像/脚本链接,并使用更多的curl调用来获取它们。
换句话说,您必须复制wget
,其归结为:只使用wget。
答案 2 :(得分: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);
}
}
?>