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 相关文章推荐
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
php根据日期显示所在星座的方法
Jul 13 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
php验证码生成器
May 24 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 PHP
php给数组赋值的实例方法
Sep 26 PHP
laravel框架创建授权策略实例分析
Nov 22 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 EOT定界符的使用详解
2008/09/30 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
JS高级运动实例分析
2016/12/20 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python中的自省(反射)详解
2015/06/02 Python
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
python 如何调用远程接口
2020/09/11 Python
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
合作意向书范本
2014/03/31 职场文书
紧急通知
2015/04/17 职场文书
golang 实现Location跳转方式
2021/05/02 Golang
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
一起来学习Python的元组和列表
2022/03/13 Python