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调用mysql数据 dbclass类
May 07 PHP
php生成图形(Libchart)实例
Nov 06 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
PHP冒泡算法详解(递归实现)
Nov 10 PHP
php在数组中查找指定值的方法
Mar 17 PHP
PHP封装的MSSql操作类完整实例
May 26 PHP
PHP微信H5支付开发实例
Jul 25 PHP
YII框架关联查询操作示例
Apr 29 PHP
php和asp语法上的区别总结
May 12 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
Oct 11 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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下获取客户端ip地址的函数
2010/03/15 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
PHP中的session安全吗?
2016/01/22 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
js数组操作常用方法
2014/05/08 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
jquery.validate使用详解
2016/06/02 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Python3.6简单反射操作示例
2018/06/14 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
python中PyQuery库用法分享
2021/01/15 Python
手机配件第一品牌:ZAGG
2017/05/28 全球购物
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
二手书店创业计划书
2014/01/16 职场文书
银行贷款承诺书
2014/03/29 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
大型活动组织方案
2014/05/10 职场文书
团队精神的演讲稿
2014/05/14 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL