PHP多线程抓取网页实现代码


Posted in PHP onJuly 22, 2010

受限于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 n个不重复的随机数生成代码
Jun 23 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
如何用php获取程序执行的时间
Jun 09 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
php禁止浏览器使用缓存页面的方法
Nov 07 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
php实现的一段简单概率相关代码
May 30 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
php数据序列化测试实例详解
Aug 12 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
七种PHP开发环境搭建工具
Jun 28 PHP
php上传文件的增强函数
Jul 21 #PHP
php 模拟POST|GET操作实现代码
Jul 20 #PHP
UCenter中的一个可逆加密函数authcode函数代码
Jul 20 #PHP
PHP连接SQLServer2005 的问题解决方法
Jul 19 #PHP
在Windows系统上安装PHP运行环境文字教程
Jul 19 #PHP
ajax实现无刷新分页(php)
Jul 18 #PHP
php将会员数据导入到ucenter的代码
Jul 18 #PHP
You might like
PHP 数字左侧自动补0
2008/03/31 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
JS设置cookie、读取cookie、删除cookie
2015/04/17 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
全面解析Vue中的$nextTick
2020/12/24 Vue.js
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
Python如何实现远程方法调用
2020/08/07 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
大学军训感言1000字
2014/02/25 职场文书
年度考核自我鉴定
2014/03/19 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
经验交流材料格式
2014/12/30 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2015年服务员工作总结
2015/04/08 职场文书
PHP中strval()函数实例用法
2021/06/07 PHP
delete in子查询不走索引问题分析
2022/07/07 MySQL