译者: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($fp, 8192)){ $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($host, 80) 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($fp, 8192); } 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 |