我用PHP编写了一个程序来查找和打印网页上的所有链接。它也会进入它找到的任何链接并执行相同的操作。我的问题是,在某些网站(如Youtube)中,它不会打印链接,也不会跟在内部。
这是我的主要代码:
function echo_urls($site_address){
if(check_valid_url($site_address)){
$site = new site();
$site->address = $site_address;
$site->full_address = "<a href=\"$site_address\">$site_address</a>";
$site->depth = 0;
$queue = new queue();
$queue->push($site);
array_push($queue->seen,$site->address);
$depth = 0;
while(($site = $queue->get_first())){
$depth++;
echo $site->depth." : ".$site->full_address."<br>";
$queue = push_links($site->address,$queue,$depth);
}
}
else;
}
function push_links($site_address,$queue,$depth){
if($depth<4){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$site_address);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec ($ch);
curl_close ($ch);
if( $result ){
preg_match_all( '/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU', $result, $list);
$list = $list[0];
foreach( $list as $item ) {
if(!(empty($item)))
if($result = get_all_string_between($item,"href=\"","\"")){
if((array_search($result[0],$queue->seen))==false){
$site = new site();
$site->address = $result[0];
$site->full_address = $item;
$site->depth = $depth;
$queue->push($site);
array_push($queue->seen,$site->address);
}
}
}
}
}
return $queue;
}
答案 0 :(得分:1)
通过查看几个函数很难说,但我的猜测是:
if($depth<4){
正在停止push_links
执行,因为它可能正在返回FALSE 另外,请不要使用RegEx。使用类似The DOMDocument class
的内容答案 1 :(得分:0)
我通常使用PHPQuery来抓取网站。这很简单