[PHP] 广度优先搜索匹配网站所有链接

复制代码
<?php
define('PRE_DOMAIN','www');
define('DOMAIN','sina.com.cn');
define('PROTOCOL','https');
define('ROOT',PROTOCOL.'://'.PRE_DOMAIN.'.'.DOMAIN.'/');


foreach (spider() as $key => $value) {
    echo $value."\r\n";
}

function spider(){
    $headers=array(
        'user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    );
    $oUrls=parseURL(get(ROOT,$headers));
    $result=array();
    $queue=array();
    foreach($oUrls as $u){
        $result[$u]=true;
        array_push($queue,$u);
        while(!empty($queue)){
            $v=array_pop($queue);
            $temp=parseURL(get($v,$headers));
            foreach($temp as $j){
                    if(!isset($result[$j])){
                            yield $j;
                            $result[$j]=true;
                            array_push($queue,$j);
                    }   
            }   
        }   
    }
}
function get($url,$header=null){
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    if (!empty($header)){
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    }   
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    $output = curl_exec($curl);

    $h = curl_getinfo($curl);
    if(!empty($h) && $h['http_code']==200 && stripos($h['content_type'],'text/html')===false){
        return "";
    }
    curl_close($curl);
    return $output;
 
}
function parseURL($content){
    preg_match_all('/<a.*href=["\']([^"\'>]*)["\'].*>/', $content,$matchs);
    if(empty($matchs[1])) return array();
    $match=$matchs[1];
    foreach ($match as $key => $value) {
        $flag=false;
        if(stripos($value, 'http')!==false && stripos($value,DOMAIN)===false){
            $flag=true;
        }
        if(stripos($value, '//')===0 && stripos($value,DOMAIN)!==false){
            $match[$key]='https:'.$value;
            continue;
        }
        if(stripos($value, '//')===0 && stripos($value,DOMAIN)===false){
            $flag=true;
        }
        if(stripos($value, 'javascript')===0||stripos($value, '#')===0){
            $flag=true;
        }
        if($flag){
            unset($match[$key]);
            continue;
        }
        if(stripos($value,DOMAIN)!==false){
            continue;
        }
        $match[$key]=ROOT.trim($value,'/');
    }
    return $match;
}
复制代码

 

posted @   唯一客服系统开发笔记  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-06-21 [日常] C语言中指针变量
2016-06-21 [PHP] 试题系统研究
点击右上角即可分享
微信分享提示
1
chat with us