curl获取网页内容
最近几天,有朋友叫我写个抓取页面链接的代码,可是我还是很懒,慢悠悠的写了一个分享出来吧,但是抓取还是很慢,有看到的朋友还请多多指点一二。
之前都是一直用的fsockopen来抓取内容的,但是换了电脑之后就发现fsockopen死活用不了。于是换用curl。
上网查了一下有关file_get_contents()、fsockopen和curl的区别
- fopen /file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。
- fopen /file_get_contents在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。
- fopen / file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
- 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函数多次,会发现很慢。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: curl ——爬网页数据
- 下一篇: ThinkPHP用jQuery发送ajax请求问题