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仿ZOL分页类代码
Oct 02 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
php天翼开放平台短信发送接口实现方法
Dec 22 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
php面向对象编程self和static的区别
May 08 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
php常用日期时间函数实例小结
Jul 04 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
Oct 25 PHP
PHP实现发送微博消息功能完整示例
Dec 04 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实时倒计时功能实现方法详解
2017/02/27 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
ionic3 懒加载
2017/08/16 Javascript
Swiper自定义分页器使用详解
2017/12/28 Javascript
python中sleep函数用法实例分析
2015/04/29 Python
python自动zip压缩目录的方法
2015/06/28 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
Python输入二维数组方法
2018/04/13 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
python类共享变量操作
2020/09/03 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
德国网上花店:Valentins
2018/08/15 全球购物
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
医院护士的求职信范文
2013/12/26 职场文书
消防器材管理制度
2014/01/28 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
行政复议决定书
2015/06/24 职场文书
投诉书格式范本
2015/07/02 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python