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用SAX解析XML的实现代码与问题分析
Aug 22 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
Dec 18 PHP
php rsa加密解密使用详解
Jan 14 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
PHP中key和current,next的联合运用实例分析
Mar 29 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
PHP学习笔记之php文件操作
Jun 03 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
在laravel5.2中实现点击用户头像更改头像的方法
Oct 14 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备份恢复分卷处理的方法
2014/12/26 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
php构造函数与析构函数
2016/04/23 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
js如何获取兄弟、父类等节点
2014/01/06 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
jQuery事件对象总结
2016/10/17 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
Python文件夹与文件的操作实现代码
2014/07/13 Python
Python中的exec、eval使用实例
2014/09/23 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
python自定义时钟类、定时任务类
2021/02/22 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
使用Python实现画一个中国地图
2019/11/23 Python
详解Python中第三方库Faker
2020/09/25 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
夜大毕业自我鉴定
2013/10/11 职场文书
教师师德承诺书
2014/03/26 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书