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基础知识:类与对象(4) 范围解析操作符(::)
Dec 13 PHP
How do I change MySQL timezone?
Mar 26 PHP
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
CodeIgniter输出中文乱码的两种解决办法
Jun 12 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
php短网址和数字之间相互转换的方法
Mar 13 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
laravel中命名路由的使用方法
Feb 24 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
简单实用的PHP文本缓存类实例
Mar 22 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
微信自定义分享链接信息(标题,图片和内容)实现过程详解
2019/09/04 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
Python编程之多态用法实例详解
2015/05/19 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
Python数据操作方法封装类实例
2017/06/23 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
Django url 路由匹配过程详解
2021/01/22 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
打架检讨书50字
2014/01/11 职场文书
安全事故检讨书
2014/01/18 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
初中作文评语
2014/12/25 职场文书
婚礼父母致辞
2015/07/28 职场文书