PHP使用CURL实现多线程抓取网页


Posted in PHP onApril 30, 2015

PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Curl Multi Functions 它可以实现并发多线程的访问多个url地址。既然 Curl Multi Function如此强大,能否用 Curl Multi Functions 来写并发多线程下载文件呢,当然可以,下面给出我的代码:

代码1:将获得的代码直接写入某个文件

<?php 
$urls = array(  
 'http://www.sina.com.cn/',  
 'http://www.sohu.com/',  
 'http://www.163.com/' 
); // 设置要抓取的页面URL  
   
$save_to='/test.txt';  // 把抓取的代码写入该文件   
  
$st = fopen($save_to,"a");  
$mh = curl_multi_init();   
  
foreach ($urls as $i => $url) {  
 $conn[$i] = curl_init($url);  
 curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");  
 curl_setopt($conn[$i], CURLOPT_HEADER ,0);  
 curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);  
 curl_setopt($conn[$i], CURLOPT_FILE,$st); // 设置将爬取的代码写入文件  
 curl_multi_add_handle ($mh,$conn[$i]);  
} // 初始化  
   
do {  
 curl_multi_exec($mh,$active);  
} while ($active); // 执行  
   
foreach ($urls as $i => $url) {  
 curl_multi_remove_handle($mh,$conn[$i]);  
 curl_close($conn[$i]);  
} // 结束清理  
   
curl_multi_close($mh);  
fclose($st); 
?>

代码2:将获得的代码先放入变量,再写入某个文件

<?php 
$urls = array(  
 'http://www.sina.com.cn/',  
 'http://www.sohu.com/',  
 'http://www.163.com/' 
);  
  
$save_to='/test.txt';  // 把抓取的代码写入该文件  
$st = fopen($save_to,"a");  
  
$mh = curl_multi_init();  
foreach ($urls as $i => $url) {  
 $conn[$i] = curl_init($url);  
 curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");  
 curl_setopt($conn[$i], CURLOPT_HEADER ,0);  
 curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);  
 curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 设置不将爬取代码写到浏览器,而是转化为字符串  
 curl_multi_add_handle ($mh,$conn[$i]);  
}  
  
do {  
 curl_multi_exec($mh,$active);  
} while ($active);  
   
foreach ($urls as $i => $url) {  
 $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串  
 fwrite($st,$data); // 将字符串写入文件。当然,也可以不写入文件,比如存入数据库  
} // 获得数据变量,并写入文件  
  
foreach ($urls as $i => $url) {  
 curl_multi_remove_handle($mh,$conn[$i]);  
 curl_close($conn[$i]);  
}  
  
curl_multi_close($mh);  
fclose($st);  
?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
用PHP 4.2书写安全的脚本
Oct 09 PHP
PHP 最大运行时间 max_execution_time修改方法
Mar 08 PHP
解析dedeCMS验证码的实现代码
Jun 07 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
php实现查询百度google收录情况(示例代码)
Aug 02 PHP
ThinkPHP3.2.2的插件控制器功能
Mar 05 PHP
thinkPHP订单数字提醒功能的实现方法
Dec 01 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 PHP
Yii2框架自定义类统一处理url操作示例
May 25 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
PHP遍历数组的方法汇总
Apr 30 #PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 #PHP
PHP实现根据银行卡号判断银行
Apr 29 #PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 #PHP
php实现中文字符截取防乱码方法汇总
Apr 29 #PHP
WIN8.1下搭建PHP5.6环境
Apr 29 #PHP
php筛选不存在的图片资源
Apr 28 #PHP
You might like
php广告加载类用法实例
2014/09/23 PHP
PHP连接access数据库
2015/03/27 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
JS实现骰子3D旋转效果
2019/10/24 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
公司同意接收函
2014/01/13 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
旅游文化节策划方案
2014/06/06 职场文书
舞蹈专业求职信
2014/06/13 职场文书
初三英语教学计划
2015/01/23 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python