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隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
解析PHP获取当前网址及域名的实现代码
Jun 23 PHP
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
php实现无限级分类(递归方法)
Aug 06 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
用Laravel轻松处理千万级数据的方法实现
Dec 25 PHP
PHP实现rar解压读取扩展包小结
Jun 03 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
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
php数组合并与拆分实例分析
2015/06/12 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
js数字转换为float,取N位小数
2014/02/08 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
深入理解python try异常处理机制
2016/06/01 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
Python探索之自定义实现线程池
2017/10/27 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
python3实现弹弹球小游戏
2019/11/25 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
介绍一下Linux文件的记录形式
2013/09/29 面试题
店长岗位职责
2013/11/21 职场文书
经贸日语专业个人求职信范文
2013/12/28 职场文书
大学校运会广播稿
2014/02/03 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
工作年限证明范本
2015/06/15 职场文书
信用卡工资证明范本
2015/06/19 职场文书
经营场所使用证明
2015/06/19 职场文书
校运会班级霸气口号
2015/12/24 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers