CURL页面采集通用方法
- 2018-09-14 10:55:00
- 小熊 原创
- 9617
首先,你要使用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。
联系人: | 小熊 |
---|---|
电话: | 18037578880 |
Email: | admin@cnsite.org |
QQ: | 929410000 |
微信: | itseor |
微博: | itseoer |
网址: | www.beatmoon.com |