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 开发工具
Dec 06 PHP
php中如何防止表单的重复提交
Aug 02 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
Yii2选项卡的简单使用
May 26 PHP
php 使用mpdf实现指定字段配置字体样式的方法
Jul 29 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 30 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 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空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
JS上传前预览图片实例
2013/03/25 Javascript
初识Node.js
2014/09/03 Javascript
JavaScript模拟push
2016/03/06 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
python中open函数的基本用法示例
2019/09/07 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
Django中的session用法详解
2020/03/09 Python
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
施工安全生产承诺书
2014/05/23 职场文书
全运会口号
2014/06/20 职场文书
节能标语大全
2014/06/21 职场文书
电气自动化求职信
2014/06/24 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
2014年技术部工作总结
2014/12/12 职场文书
兵马俑导游词
2015/02/02 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android