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中大括号作用介绍
Mar 22 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
解析php addslashes()与addclashes()函数的区别和比较
Jun 24 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
自己写的php curl库实现整站克隆功能
Feb 12 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
php生成gif动画的方法
Nov 05 PHP
php如何执行非缓冲查询API
Jul 22 PHP
PHP检测接口Traversable用法详解
Dec 29 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
在thinkphp5.0路径中实现去除index.php的方式
Oct 16 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 array_unique之后json_encode需要注意
2011/01/02 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
js 省地市级联选择
2010/02/07 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
js运动事件函数详解
2016/10/21 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python实现多线程的两种方式
2016/05/22 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
Python程序慢的重要原因
2020/09/04 Python
python实现粒子群算法
2020/10/15 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
Delphi笔试题
2016/11/14 面试题
校庆活动方案
2014/03/31 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
逃课检讨书
2015/01/26 职场文书
公务员政审个人总结
2015/02/12 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书