curl获取网页内容

最近几天,有朋友叫我写个抓取页面链接的代码,可是我还是很懒,慢悠悠的写了一个分享出来吧,但是抓取还是很慢,有看到的朋友还请多多指点一二。

之前都是一直用的fsockopen来抓取内容的,但是换了电脑之后就发现fsockopen死活用不了。于是换用curl。

上网查了一下有关file_get_contents()、fsockopen和curl的区别

  1. fopen /file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。
  2. fopen /file_get_contents在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。
  3. fopen / file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
  4. curl可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。

结论就是,curl 效率及稳定都比 file_get_contents() 要好,fsockopen 也很强大,但是比较偏底层。


所以采集的话用curl和fsockopen都不错。

下面函数是获取网页内容的

function curl_get_contents($url){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch,CURLOPT_FAILONERROR,1);
	$r = curl_exec($ch);
	$err = curl_errno($ch);
	curl_close($ch);
	if($err == 0){
		return $r;
	}
	return false;
}

curl参数很多,配置项也很多,想了解的话多看看手册吧。

下面函数是获取页面匹配内容

function geturlarray($arr,$url,$output,$pattern){
	$result = array();
	foreach($arr as $key=>$value){
		if($value){
			$data = curl_get_contents($value);
			if($data){
				if($output){
					echo $value."<br/>";
				}
				$sql = "insert into google(`url`) values('$value')";
				mysql_query($sql);
				$matches = getmatches($pattern,$data);
				$getdata = $matches[1];
				foreach($getdata as $k=>$v){
					$v = correct_url($url,$v);
					if(!$v){
						unset($getdata[$k]);
					}else{
						$getdata[$k] = $v;
					}
				}
				$result = array_merge($result,$getdata);
			}
		}
	}
	return $result;
}

下面函数是纠正链接地址

function correct_url($url,$str){
	//return $str;
	if(($str != "#")&&($str != $url."/")&&(!empty($str))){
		if($str[0] == "/"){
			if(!strpos($url.$str,".css")){
				return $url.$str;
			}
		}else{
			if(strpos($str,$url)!== false){
				if(!strpos($str,".css")){
					return $str;
				}
			}			
		}
	}
	return false;
}

用法如下:

$output = 1;
$pattern = '$href="(.*)"$Ui';
$url = "http://www.baidu.com";
$arr = array($url);
$data = geturlarray($arr,$url,$output,$pattern);

写到正则发现好久不曾写都忘记了,没事还是要多看看。

如果循环抓取多次的话,即循环geturlarray函数多次,会发现很慢。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值