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 遍历文件实现代码
May 04 PHP
php 数组使用详解 推荐
Jun 02 PHP
php购物车实现代码
Oct 10 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
php 中奖概率算法实现代码
Jan 25 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
Mar 14 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
解决Laravel 不能创建 migration 的问题
Oct 09 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 PHP
PHP解决高并发问题
Apr 01 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获取发送给用户的header信息的方法
2015/03/16 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
质检的岗位职责
2013/11/17 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
成都人事代理协议书
2014/10/25 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
小学生作文批改评语
2014/12/25 职场文书
会议欢迎词范文
2015/01/27 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
各国货币符号大全
2022/02/17 杂记
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技