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 COOKIE设置为浏览器进程
Jun 21 PHP
网页游戏开发入门教程二(游戏模式+系统)
Nov 02 PHP
ezSQL PHP数据库操作类库
May 16 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
PHP中的Trait 特性及作用
Apr 03 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
May 21 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
PHP实现找出链表中环的入口节点
Jan 16 PHP
Laravel实现ORM带条件搜索分页
Oct 24 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 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
pyhton列表转换为数组的实例
2018/04/04 Python
python查看列的唯一值方法
2018/07/17 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
租房协议书
2014/04/10 职场文书
数学教研活动总结
2014/07/02 职场文书
婚礼家长致辞
2015/07/27 职场文书
Redis可视化客户端小结
2021/06/10 Redis