CURL页面采集通用方法
- 2018-09-14 10:55:00
- 小熊 原创
- 10980
首先,你要使用CURL的话,需要开启CURL扩展,即在php.ini文件把curl拓展开启,即取消extension=php_curl.dll的分号。
打开php.ini文件,开启扩展。
vi php.ini
CURL的具体使用方法就不多说了,先上函数。
/**
* 页面采集通用方法
* @param string $url 采集的url
* @param array $postData post提交的数据
* @param array $header header头数组,curl命令里的-H参数组成的数组
* @param array $opts option数组,供额外添加opt属性,key为curl_setopt第二参数,value为curl_setopt第三参数
* @param string $cookieSaveFile 存储cookie的文件
* @param string $cookieGetFile 读取cookie的文件(可以是上一个getPage存下来的cookie文件)
* @param string $timeout 超时时间
* @return string
* @author itbear <admin@cnsite.org>
* @link www.beatmoon.com
*/
function curlPage( $url, $postData = array(), $header = array(), $opts = array(), $cookieSaveFile = '', $cookieGetFile = '' , $timeout = 0 ) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回数据不直接输出
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //指定gzip压缩
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //302/301
//SSL
if(substr($url, 0, 8) === 'https://') {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)解决
//值有0-6,请参考手册,值1不行试试其他值
//curl_setopt($ch, CURLOPT_SSLVERSION, 1);
}
//post数据
if(!empty($postData)) {
curl_setopt($ch, CURLOPT_POST, 1); //发送POST类型数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); //POST数据,$post可以是数组(multipart/form-data),也可以是拼接参数串(application/x-www-form-urlencoded)
}
/*
//header demo
$header = array(
'Host: www.zjmainstay.cn',
'Referer: http://www.zjmainstay.cn/',
'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:50.0) Gecko/20100101 Firefox/50.0',
);
*/
//对cURL命令使用正则替换 -H 为 ,\n 即可得到数组项,一般移除其中的cookie,由上一个页面存储并使用,参考$cookieSaveFile/$cookieGetFile参数
//如果是json格式上传,其中的Content-Length需要针对提交内容用strlen计算得到并替换
//头信息
if(!empty($header)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //使用header头信息
}
//额外option
if(!empty($opts)) {
foreach($opts as $key => $value) {
curl_setopt($ch, $key, $value); //使用header头信息
}
}
//存储cookie到文件
if(!empty($cookieSaveFile)) {
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookieSaveFile); //存储提交后得到的cookie数据
}
//使用存储的cookie内容(上一次请求得到的cookie文件)
if(!empty($cookieGetFile)) {
curl_setopt($ch,CURLOPT_COOKIEFILE,$cookieGetFile); //使用提交后得到的cookie数据做参数
}
//超时时间
if(!empty($timeout)) {
curl_setopt($ch, CURLOPT_TIMEOUT, (int)$timeout);
}
//执行
$content = curl_exec($ch);
if($error = curl_error($ch)) {
//log error
error_log($error);
}
curl_close($ch);
return $content;
}
函数的具体使用方法,备注的很明确,就不多说了。
我们在采集网页的时候,通常我们也会用file_get_contents(),fopen()。它们的优点是使用比较简单,但是也有一些缺点,如下。
PHP中fopen,file_get_contents,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方式获取数据。
file_get_contents 获取远程文件时会把结果都存在一个字符串中 fiels函数则会储存成数组形式,因此,我还是比较建议使用curl来访问远程url。Php有curl模块扩展,功能很是强大。
网上大家都说,CURL性能要比file_get_contents()等要高得多,所以在采集大量网页的时候,还是建议大家使用curl。
| 联系人: | 小熊 |
|---|---|
| 电话: | 180****8880 |
| Email: | admin@cnsite.org |
| QQ: | 929410000 |
| 微信: | itseor |
| 微博: | itseoer |
| 网址: | www.beatmoon.com |


