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 相关文章推荐
第4章 数据处理-php正则表达式-郑阿奇(续)
Jul 04 PHP
php 常用算法和时间复杂度
Jul 01 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
php 获取SWF动画截图示例代码
Feb 10 PHP
PHP获取windows登录用户名的方法
Jun 24 PHP
PHP 魔术变量和魔术函数详解
Feb 25 PHP
分享一个Laravel好用的Cache宏
Mar 02 PHP
非常重要的php正则表达式详解
Jan 04 PHP
PHP调试的强悍利器之PHPDBG
Feb 22 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 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
Terran兵种对照表
2020/03/14 星际争霸
php邮件发送的两种方式
2020/04/28 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
PHP 实现浏览记录并按日期分组
2017/05/11 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
javascript replace()正则替换实现代码
2010/02/26 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
Python正则表达式知识汇总
2017/09/22 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
财务部副经理岗位职责
2014/03/14 职场文书
关于读书的演讲稿
2014/05/07 职场文书
行政处罚告知书
2015/07/01 职场文书
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android