使用curl获取页面所有链接

作者:enenba | 发表于:2012-05-21 22:55 | 分类:php采集

一般php采集网络数据会用file_get_contents、file和cURL。当然我听说cURL会比file_get_contents、file更快更专业,更适合采集。今天我试试用cURL来获取网页上的所有链接。

<?php
/*
 * 使用curl 采集hao123.com下的所有链接。  
 */
include_once('function.php');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.hao123.com/');
// 只需返回HTTP header
curl_setopt($ch, CURLOPT_HEADER, 1);
// 页面内容我们并不需要
// curl_setopt($ch, CURLOPT_NOBODY, 1);
// 返回结果,而不是输出它
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
$info = curl_getinfo($ch);
if ($html === false) {
	echo "cURL Error: " . curl_error($ch);
} 

curl_close($ch);
$linkarr = _striplinks($html);
// 主机部分,补全用
$host = 'http://www.hao123.com/';
if (is_array($linkarr)) {
	foreach ($linkarr as $k => $v) {
		$linkresult[$k] = _expandlinks($v, $host);
	} 
} 

printf("<p>此页面的所有链接为:</p><pre>%s</pre>\n", var_export($linkresult , true));

?>

 

function.php中为以下内容

<?php

function _striplinks($document) {
	preg_match_all("'<\s*a\s.*?href\s*=\s*([\"\'])?(?(1) (.*?)\\1 | ([^\s\>]+))'isx", $document, $links); 
	// catenate the non-empty matches from the conditional subpattern
	while (list($key, $val) = each($links[2])) {
		if (!empty($val))
			$match[] = $val;
	} while (list($key, $val) = each($links[3])) {
		if (!empty($val))
			$match[] = $val;
	} 
	// return the links
	return $match;
} 

/*===================================================================*\
	Function:	_expandlinks
	Purpose:	expand each link into a fully qualified URL
	Input:		$links			the links to qualify
				$URI			the full URI to get the base from
	Output:		$expandedLinks	the expanded links
\*===================================================================*/
function _expandlinks($links,$URI)
{
	$URI_PARTS = parse_url($URI);
	$host = $URI_PARTS["host"];
	preg_match("/^[^\?]+/",$URI,$match);

	$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
	$match = preg_replace("|/$|","",$match);
	$match_part = parse_url($match);
	$match_root =
	$match_part["scheme"]."://".$match_part["host"];
			
	$search = array( 	"|^http://".preg_quote($host)."|i",
						"|^(\/)|i",
						"|^(?!http://)(?!mailto:)|i",
						"|/\./|",
						"|/[^\/]+/\.\./|"
					);
					
	$replace = array(	"",
						$match_root."/",
						$match."/",
						"/",
						"/"
					);			
			
	$expandedLinks = preg_replace($search,$replace,$links);

	return $expandedLinks;
}

?>

匹配链接函数介绍: function _striplinks()

相对路径转绝对介绍:function _expandlinks()

得到的结果很满意。都获取到了链接,并且比file_get_contents快了3、4秒这样。

CURL本身就是利用URL语法在命令行方式下工作的文件传输工具。很容易就获取到网页数据,而且速度很快。那来采集是最好不过了,以后我将用CURL代替file_get_contents、file了。

end..

上一篇: 看来美国空间也不给力   |   下一篇:正则表达式解二元方程式» 标签: php函数 php采集 PHP正则 curl

评论:

2012-06-11 23:19

Nice.
绿色,低碳,环保.

2012-06-11 23:22

额,说的都变绿色产品了。