PHP使用CURL实现多线程抓取网页


Posted in PHP onApril 30, 2015

PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于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中使用Oracle数据库(6)
Oct 09 PHP
对javascript和select部件的结合运用
Oct 09 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
openPNE常用方法分享
Nov 29 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
php中__toString()方法用法示例
Dec 07 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
php微信扫码支付 php公众号支付
Mar 24 PHP
PHP遍历数组的方法汇总
Apr 30 #PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 #PHP
PHP实现根据银行卡号判断银行
Apr 29 #PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 #PHP
php实现中文字符截取防乱码方法汇总
Apr 29 #PHP
WIN8.1下搭建PHP5.6环境
Apr 29 #PHP
php筛选不存在的图片资源
Apr 28 #PHP
You might like
php不用正则采集速度探究总结
2008/03/24 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
php生成图片验证码的方法
2016/04/15 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
Javascript使用post方法提交数据实例
2015/08/03 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
优良学风班总结材料
2014/02/08 职场文书
学习教师法的心得体会
2014/09/03 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
经理岗位职责
2015/02/02 职场文书
职位证明模板
2015/06/23 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
Python可视化神器pyecharts绘制水球图
2022/07/07 Python