抓取页面并将内部和外部链接分开

时间:2012-11-07 11:08:26

标签: php dom web-scraping

构建一个小的PHP scrapper,我正在编写一个小功能,它应该将我的内部和外部分开。外部链接,

我正在将函数传递给html源代码的副本以及基本主机地址

$source = file_get_contents('http://www.mysite.com');
$host   = "mysite.com";

这是我到目前为止的功能......

function find_page_links($source, $host){

    if($source){

    $htmlDoc = new DomDocument();
    @$htmlDoc->loadhtml($source);

    $int_links = array();
    $ext_links = array();

    // GET LINKS
    foreach($htmlDoc->getElementsByTagName('a') as $link) {

        $url   = trim($link->getAttribute('href'));
        $title = trim($link->getAttribute('title'));
        $text  = trim($link->nodeValue);
        $rel   = trim($link->getAttribute('rel'));

        $pos = strpos($url,$host);

        if( $pos === false ){ // NO MATCH EXTERNAL              
            if( (substr($url, 0, 1) == '/') || 
                        (substr($url, 0, 1) == '#') )
                    {
            // INTERNAL
            $int_links[] = array( 'link_url' => $url, 
                                          'link_text' => $text, 
                                          'link_title' => $title, 
                                          'link_rel' => $rel 
                                        );
            }else{
            // EXTERNAL
            $ext_links[] = array( 'link_url' => $url, 
                                          'link_text' => $text, 
                                          'link_title' => $title, 
                                          'link_rel' => $rel 
                                        );
            }
        }else{
             if( $pos < 20 ){
             // INTERNAL
             $int_links[] = array( 'link_url' => $url, 
                                       'link_text' => $text, 
                                       'link_title' => $title, 
                                       'link_rel' => $rel );
             }else{
             // EXTERNAL
             $ext_links[] = array( 'link_url' => $url, 
                                         'link_text' => $text, 
                                         'link_title' => $title, 
                                         'link_rel' => $rel 
                                        );  
             }
        } // end else
    } // end foreach

    $content = array();
    $content['int_links'] = $int_links;
    $content['ext_links'] = $ext_links;

    return $content ;
  }
}

所以最新发生的是该函数通过DomDocument加载HTML 我创建了2个数组来存储内部和外部外部

遍历文档和getElementsByTagName('a')

然后使用strpos检查主机地址“mysite.com”是否在链接URL中如果没有匹配/ false然后它是外部的,但我们进一步检查以确保链接URL不是以正斜线即:“ /contact-us.php ”,这意味着它是一个内部,也在检查中我们检查开头的“”标签是页面上的锚链接...

所以那是IF pos === false /不匹配 now如果主机在链接URL中是匹配的,我会再做一次检查,看看主机的位置是否在字符串中较低,这是内部的,即: http://mysite.com/about/

但是如果位置大于20(只是一个从空中拔出的数字)那么...... 像谷歌加链接或Facebook链接主机网址将出现在链接中,但更多沿着字符串,这将意味着它的外部,

ie:http://www.facebook.com/plugins/like.php?href=http://mysite.com/

...呼

如果你们有其他更好的方法来发现外部或内部链接,请告诉我..我的结果,根据网站的不同,如果链接使用完整路径,

0 个答案:

没有答案