我如何限制这个PHP代码抓取与给定域具有相同基础的链接

  • 本文关键字:链接 何限制 PHP 抓取 代码 php
  • 更新时间 :
  • 英文 :


我正在编写一个代码,它是一个爬网程序,但我希望它能爬网所有具有相同基础的链接。例如,如果你设置了一个大深度,并且你的页面中有一个链接到你的推特,它会扫描推特,并给你像twitter.com.xxxxyyyzzz这样的结果。

我想要的是限制代码只能抓取具有相同基础的url。我不介意在一个新变量中再次设置域。

过滤结果并在最后只显示正确的链接不是合适的方式。想象一下,如果你找到1000个链接,而你只想要10个。

谢谢你的想法。(正确的代码在答案中)

修改

试试这个尺寸的

function crawl_page($url, $depth = 2) {
    static $seen = array();
    if (isset($seen[$url]) || $depth == 0) {
        return;
    }
    
    $seen[$url] = true;
    $parts = parse_url($url);
    $dom = new DOMDocument('1.0');
    if (!$parts || !@$dom->loadHTMLFile($url)) {
        return;
    }
    
    $anchors = $dom->getElementsByTagName('a');
    foreach ($anchors as $anchor) {
        $href = $anchor->getAttribute('href');
        $path = false;
        if (0 !== strpos($href, 'http') && 0 !== strpos($href, 'javascript:')) {
            $path = '/' . ltrim($href, '/');
            if (extension_loaded('http')) {
                $path = http_build_url($url, array('path' => $path));
            }
            else {
                $href = "{$parts['scheme']}://";
                if (isset($parts['user'])) {
                    $href .= $parts['user'];
                    if (isset($parts['pass'])) {
                        $href .= ":{$parts['pass']}";
                    }
                    $href .= '@';
                }
                $href .= $parts['host'];
                if (isset($parts['port'])) {
                    $href .= ':' . $parts['port'];
                }
                $path = $href . $path;
            }
        }
        else {
            $href_parts = parse_url($href);
            if($href_parts['host'] == $parts['host'] && $href_parts['scheme'] == $parts['scheme']) {
                $path = $href;
            }
        }
        if (!empty($path) && $depth - 1 != 0) {
            crawl_page($path, $depth - 1);
        }
    }
    echo "Crawled: {$url}n";
}

最新更新