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 相关文章推荐
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
php escape URL编码
Dec 10 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
php+mysql实现无限级分类
Nov 11 PHP
PHP模块化安装教程
Jun 01 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
Oct 18 PHP
PHP实现简单登录界面
Oct 23 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连mysql和oracle数据库性能比较
2006/10/09 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python发布模块的步骤分享
2014/02/21 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
python学习数据结构实例代码
2015/05/11 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
使用python3构建文件传输的方法
2019/02/13 Python
python3实现表白神器
2019/04/09 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
django 取消csrf限制的实例
2020/03/13 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
秋季婚礼证婚词
2014/01/11 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
React Fragment介绍与使用详解
2021/11/11 Javascript
python超详细实现完整学生成绩管理系统
2022/03/17 Python
DSP接收机前端设想
2022/04/05 无线电