【问题标题】:Using cURL to get all links in a website (not only the page)使用 cURL 获取网站中的所有链接(不仅仅是页面)
【发布时间】:2011-10-25 06:06:44
【问题描述】:

我使用以下 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);

?>

有什么方法可以使用 cURL(或者坦率地说任何其他方法)来获取网站上的所有链接?如果您想知道,我可以访问服务器。

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

任何帮助将不胜感激!

【问题讨论】:

  • 您可以研究phpQuery,它简化了页面检索和解析,允许构建一个简单的蜘蛛,而不是手动卷曲和文本提取方法。
  • 您上面的脚本对我帮助很大,谢谢 =)
  • 我用过this;不确定它是否会有所帮助。

标签: php curl hyperlink


【解决方案1】:

正如@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
)

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    换句话说,您必须复制wget,归结为:只需使用wget

    【讨论】:

      【解决方案3】:

      我也在尝试使用 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);
      
      }
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        相关资源
        最近更新 更多