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 日,周,月点击排行统计
Jan 11 PHP
逆序二维数组插入一元素的php代码
Jun 08 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
php生成动态验证码gif图片
Oct 19 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
详解PHP神奇又有用的Trait
Mar 25 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
详解PHP设计模式之依赖注入模式
May 25 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 工厂模式使用方法
2010/05/18 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
JS实现手风琴特效
2020/11/08 Javascript
Python发送email的3种方法
2015/04/28 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python目录与文件名操作例子
2016/08/28 Python
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
explicit和implicit的含义
2012/11/15 面试题
医疗纠纷协议书
2014/04/16 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
车辆挂靠协议书
2016/03/23 职场文书
学生会自荐信
2019/05/16 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL