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中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
Jun 25 PHP
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
php使用session二维数组实例
Nov 06 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php保存任意网络图片到服务器的方法
Apr 14 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
PHP针对多用户实现更换头像功能
Sep 04 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
php微信公众号开发之答题连闯三关
Oct 20 PHP
laravel5.2表单验证,并显示错误信息的实例
Sep 29 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
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
Jquery中对数组的操作代码
2011/08/12 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
vue按需加载实例详解
2019/09/06 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
python中assert用法实例分析
2015/04/30 Python
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
Python多线程的退出控制实现
2020/08/10 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
工商管理毕业生推荐信
2013/12/24 职场文书
报关报检委托书
2014/04/08 职场文书
甜品店创业计划书
2014/09/21 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
丧事答谢词
2015/01/05 职场文书
董存瑞观后感
2015/06/11 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL