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同时支持GIF、png、JPEG
Oct 09 PHP
PHP 定界符 使用技巧
Jun 14 PHP
php5 图片验证码实现代码
Dec 11 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
Jan 17 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
php判断用户是否手机访问代码
Jun 08 PHP
常见PHP数据库解决方案分析介绍
Sep 24 PHP
PHP利用APC模块实现大文件上传进度条的方法
Oct 29 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 PHP
php+croppic.js实现剪切上传图片功能
Aug 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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
Position属性之relative用法
2015/12/14 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
Vue仿百度搜索功能
2020/12/28 Vue.js
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
深入了解Django中间件及其方法
2019/07/26 Python
Python配置文件处理的方法教程
2019/08/29 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
西部世纪面试题
2014/12/05 面试题
我的大学生活职业生涯规划
2014/01/02 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
勾股定理课后反思
2014/04/26 职场文书
整改报告格式
2014/11/06 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android