curl实现站外采集的方法和技巧


Posted in PHP onJanuary 31, 2014

选择curl的理由

关于curl与file_get_contents,摘抄一段通俗易懂的对比:
file_get_contents其实是一堆内置的文件操作函数的合并版本,比如file_exists,fopen,fread,fclose,专门提供给懒人用的,而且它主要是用来对付本地文件的,但又是因为懒人的原因,同时加入了对网络文件的支持;
curl是专门用来进行网络交互的库,提供了一堆自定义选项,用来应对不同的环境,稳定性自然要大于file_get_contents。

使用方法

1、开启curl支持

由于php环境安装后默认是没有打开curl支持的,需修改php.ini文件,找到;extension=php_curl.dll,把前面的冒号去掉,重启服务即可;

2、使用curl进行数据抓取

// 初始化一个 cURL 对象 
$curl = curl_init(); 
// 设置你需要抓取的URL 
curl_setopt($curl, CURLOPT_URL, 'http://www.cmx8.cn'); 
// 设置header 
curl_setopt($curl, CURLOPT_HEADER, 1); 
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
// 运行cURL,请求网页 
$data = curl_exec($curl); 
// 关闭URL请求 
curl_close($curl);

3、通过正则匹配找到关键数据

//$data是curl_exec返回的的值,即采集的目标内容 
preg_match_all("/<li class=\"item\">(.*?)<\/li>/",$data, $out, PREG_SET_ORDER); 
foreach($out as $key => $value){ 
    //此处$value是数组,同时记录找到带匹配字符的整句和单独匹配的字符 
    echo '匹配到的整句:'.$value[0].'
'; 
    echo '单独匹配到的:'.$value[1].'
'; 
}

技巧

1、超时的相关设置

通过curl_setopt($ch, opt) 可以设置一些超时的设置,主要包括:

CURLOPT_TIMEOUT 设置cURL允许执行的最长秒数。
CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。 (在cURL 7.16.2中被加入。从PHP 5.2.3起可使用。 )
CURLOPT_CONNECTTIMEOUT 在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。 在cURL 7.16.2中被加入。从PHP 5.2.3开始可用。
CURLOPT_DNS_CACHE_TIMEOUT 设置在内存中保存DNS信息的时间,默认为120秒。

curl_setopt($ch, CURLOPT_TIMEOUT, 60);   //只需要设置一个秒的数量就可以 
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);    //注意,毫秒超时一定要设置这个 
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);  //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用

2、通过post提交数据,保留cookie

//以下摘抄一个例子过来,用于学习借鉴: 
//Curl 模拟登录 discuz 程序,适合DZ7.0 !extension_loaded('curl') && die('The curl extension is not loaded.');    
$discuz_url = 'http://www.lxvoip.com';//论坛地址    
$login_url = $discuz_url .'/logging.php?action=login';//登录页地址    
$get_url = $discuz_url .'/my.php?item=threads'; //我的帖子    
$post_fields = array();    
//以下两项不需要修改    
$post_fields['loginfield'] = 'username';    
$post_fields['loginsubmit'] = 'true';    
//用户名和密码,必须填写    
$post_fields['username'] = 'lxvoip';    
$post_fields['password'] = '88888888';    
//安全提问    
$post_fields['questionid'] = 0;    
$post_fields['answer'] = '';    
//@todo验证码    
$post_fields['seccodeverify'] = '';    
//获取表单FORMHASH    
$ch = curl_init($login_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    
$contents = curl_exec($ch);    
curl_close($ch);    
preg_match('/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);    
if(!empty($matches)) {    
    $formhash = $matches[1];    
} else {    
    die('Not found the forumhash.');    
}    
//POST数据,获取COOKIE    
$cookie_file = dirname(__FILE__) . '/cookie.txt';    
//$cookie_file = tempnam('/tmp');    
$ch = curl_init($login_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    
curl_setopt($ch, CURLOPT_POST, 1);    
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);    
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);    
curl_exec($ch);    
curl_close($ch);    
//带着上面得到的COOKIE获取需要登录后才能查看的页面内容    
$ch = curl_init($get_url);    
curl_setopt($ch, CURLOPT_HEADER, 0);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);    
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);    
$contents = curl_exec($ch);    
curl_close($ch);    
var_dump($contents);
PHP 相关文章推荐
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 PHP
CodeIgniter配置之autoload.php自动加载用法分析
Jan 20 PHP
PHP读取大文件的多种方法介绍
Apr 04 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
PHP中非常有用却鲜有人知的函数集锦
Aug 17 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 #PHP
php使用百度翻译api示例分享
Jan 31 #PHP
php比较两个绝对时间的大小
Jan 31 #PHP
2014过年倒计时示例
Jan 31 #PHP
php curl post 时出现的问题解决
Jan 30 #PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 #PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
Jan 30 #PHP
You might like
如何选购合适的收音机
2021/03/01 无线电
cache_lite试用
2007/02/14 PHP
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
怎么清空javascript数组
2013/05/11 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
python实现简单登陆系统
2018/10/18 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
Python-opencv 双线性插值实例
2020/01/17 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
《会变的花树叶》教学反思
2014/02/10 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
市级文明单位申报材料
2014/05/07 职场文书
2014年党小组工作总结
2014/12/20 职场文书
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android