逍遥游戏社区 1.0 beta  游戏博客 相册 圈子 帮助
http://blog.xoyo.com/dcyhldcyhl  [加为友情链接]  [加为收藏]
潮起
网际旋风的Blog
学艺要精,专注LAMP
文章分类
全部文章(62)
投稿文章(0)
mysql(7)
linux(29)
apache(1)
php(7)
生活(6)
javascript(2)
最新评论
function getOs() { if(nav...
感觉不错,研究一下,
mysql密码忘记怎么办? 如...
lighttpd -D ../lib -f conf/lig...
mirrorbinlog可以解决各IDC直接r...
附上175的err记录 /usr/local/...
附上176的err文件记录 070511 ...
今天下午总结了一下,有时lightt...
http://down1.chinaunix.net/dis...
http://telia.dl.sourceforge.ne...
最新留言
清风狂风祝您 中秋快乐! 金山...
过来占楼 呵呵~~~
PHP抓取网页和分析
 [收藏本文]

译者:limodou
  抓取和分析一个文件是非常简单的事。这个教程将通过一个例子带领你一步一步地去实现它。让我们开
始吧!

  首先,我首必须决定我们将抓取的URL地址。可以通过在脚本中设定或通过$QUERY_STRING传递。为了简
单起见,让我们将变量直接设在脚本中。
<? $url = 'http://www.php.net'; ?> 

  第二步,我们抓取指定文件,并且通过file()函数将它存在一个数组里。
<? $url = 'http://www.php.net'; $lines_array = file($url); ?> 

  好了,现在在数组里已经有了文件了。但是,我们想分析的文本可能不全在一行里面。为了解决这个文
件,我们可以简单地将数组$lines_array转化成一个字符串。我们可以使用implode(x,y)函数来实现它。如
果在后面你想用explode(将字符串变量数组),将x设成"|"或"!"或其它类似的分隔符可能会更好。但是出于
我们的目的,最好将x设成空格。y是另一个必要的参数,因为它是你想用implode()处理的数组。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); ?> 

  现在,抓取工作就做完了,下面该进行分析了。出于这个例子的目的,我们想得到在<head>到</head>
之间的所有东西。为了分析出字符串,我们还需要叫做正规表达式的东西。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); ?> 

  让我们看一下代码。正如你所见,eregi()函数按下面的格式执行:
eregi("<head>(.*)</head>", $lines_string, $head); 

  "(.*)"表示所有东西,可以解释为,"分析在<head>和</head>间的所以东西"。$lines_string是我们正
在分析的字符串,$head是分析后的结果存放的数组。
  最后,我们可以输数据。因为仅在<head>和</head>间存在一个实例,我们可以安全的假设数组中仅存
在着一个元素,而且就是我们想要的。让我们把它打印出来吧。
<? $url = 'http://www.php.net'; $lines_array = file($url); $lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head); echo $head[0]; ?> 


  这就是全部的代码了。

<?php

//获取所有内容url保存到文件
function get_index($save_file$prefix="index_"
){
    
$count 68
;
    
$i 1
;
    if (
file_exists($save_file)) @unlink($save_file
);
    
$fp fopen($save_file"a+") or die("Open "$save_file ." failed"
);
    while(
$i<$count
){
        
$url $prefix $i .".htm"
;
        echo 
"Get "$url ."..."
;
        
$url_str get_content_url(get_url($url
));
        echo 
" OK\n"
;
        
fwrite($fp$url_str
);
        ++
$i
;
    }
    
fclose($fp
);
}

//获取目标多媒体对象
function get_object($url_file$save_file$split="|--:**:--|"
){
    if (!
file_exists($url_file)) die($url_file ." not exist"
);
    
$file_arr file($url_file
);
    if (!
is_array($file_arr) || empty($file_arr)) die($url_file ." not content"
);
    
$url_arr array_unique($file_arr
);
    if (
file_exists($save_file)) @unlink($save_file
);
    
$fp fopen($save_file"a+") or die("Open save file "$save_file ." failed"
);
    foreach(
$url_arr as $url
){
        if (empty(
$url
)) continue;
        echo 
"Get "$url ."..."
;
        
$html_str get_url($url
);
        echo 
$html_str
;
        echo 
$url
;
        exit;
        
$obj_str get_content_object($html_str
);
        echo 
" OK\n"
;
        
fwrite($fp$obj_str
);
    }
    
fclose($fp
);
}

//遍历目录获取文件内容
function get_dir($save_file$dir
){
    
$dp opendir($dir
);
    if (
file_exists($save_file)) @unlink($save_file
);
    
$fp fopen($save_file"a+") or die("Open save file "$save_file ." failed"
);
    while((
$file readdir($dp)) != false
){
        if (
$file!="." && $file!=".."
){
            echo 
"Read file "$file ."..."
;
            
$file_content file_get_contents($dir $file
);
            
$obj_str get_content_object($file_content
);
            echo 
" OK\n"
;
            
fwrite($fp$obj_str
);
        }
    }
    
fclose($fp
);
}


//获取指定url内容
function get_url($url
){
    
$reg '/^http:\/\/[^\/].+$/'
;
    if (!
preg_match($reg$url)) die($url ." invalid"
);
    
$fp fopen($url"r") or die("Open url: "$url ." failed."
);
    while(
$fc fread($fp8192
)){
        
$content .= $fc
;
    }
    
fclose($fp
);
    if (empty(
$content
)){
        die(
"Get url: "$url ." content failed."
);
    }
    return 
$content
;
}

//使用socket获取指定网页
function get_content_by_socket($url$host
){
    
$fp fsockopen($host80) or die("Open "$url ." failed"
);
    
$header "GET /".$url ." HTTP/1.1\r\n"
;
    
$header .= "Accept: */*\r\n"
;
    
$header .= "Accept-Language: zh-cn\r\n"
;
    
$header .= "Accept-Encoding: gzip, deflate\r\n"
;
    
$header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n"
;
    
$header .= "Host: "$host ."\r\n"
;
    
$header .= "Connection: Keep-Alive\r\n"
;
    
//$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n";
    
$header .= "Connection: Close\r\n\r\n"
;

    
fwrite($fp$header
);
    while (!
feof($fp
)) {
        
$contents .= fgets($fp8192
);
    }
    
fclose($fp
);
    return 
$contents
;
}


//获取指定内容里的url
function get_content_url($host_url$file_contents
){

    
//$reg = '/^(#|javascript.*?|ftp:\/\/.+|http:\/\/.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i';
    //$reg = '/^(down.*?\.html|\d+_\d+\.htm.*?)$/i';
    
$rex "/([hH][rR][eE][Ff])\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*/i"
;
    
$reg '/^(down.*?\.html)$/i'
;
    
preg_match_all ($rex$file_contents$r
);
    
$result ""
//array();
    
foreach($r as $c
){
        if (
is_array($c
)){
            foreach(
$c as $d
){
                if (
preg_match($reg$d)){ $result .= $host_url $d."\n"
; }
            }
        }
    }
    return 
$result
;
}

//获取指定内容中的多媒体文件
function get_content_object($str$split="|--:**:--|"
){    
    
$regx "/href\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*(.*?<\/b>)/i"
;
    
preg_match_all($regx$str$result
);

    if (
count($result) == 3
){
        
$result[2] = str_replace("多媒体: """$result[2
]);
        
$result[2] = str_replace("
"""$result[2]);
        
$result $result[1][0] . $split .$result[2][0] . "\n"
;
    }
    return 
$result
;
}

?>
网际旋风发布于 2007-11-07 11:25:06   阅读(62)  评论(1)  类别[php]
评论
我有话要说
昵称:
主页:
验证码:
内容:
 
禁用表情:
 
Copyright © 2006-2008 xoyo.com, All rights reserved