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
Nov 08 PHP
特详细的PHPMYADMIN简明安装教程
Aug 01 PHP
php中计算时间差的几种方法
Dec 31 PHP
php开发过程中关于继承的使用方法分享
Jun 17 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
PHP编程风格规范分享
Jan 15 PHP
PHP使用递归生成文章树
Apr 21 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 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 xml常用函数的集合(比较详细)
2013/06/06 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
AngularJS 异步解决实现方法
2017/06/12 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
行政管理毕业生自荐信
2014/02/24 职场文书
个人投资计划书
2014/05/01 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
节水倡议书
2015/01/19 职场文书
出纳试用期自我评价
2015/03/10 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
文艺演出主持词
2015/07/01 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
合作合同协议书
2016/03/21 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
教你nginx跳转配置的四种方式
2022/07/07 Servers