PHP抓取网页和分析 【转】

本文介绍了一个简单的PHP脚本,用于抓取指定URL的内容并分析<head>标签内的信息。通过示例展示了如何使用file()函数读取网页,implode()函数组合数组,以及eregi()函数解析特定模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

译者: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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值