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中使用Oracle数据库(4)
Oct 09 PHP
php实现无限级分类实现代码(递归方法)
Jan 01 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
PHP防盗链代码实例
Aug 27 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
php类的自动加载操作实例详解
Sep 28 PHP
PHP简单实现记录网站访问量功能示例
Jun 06 PHP
Laravel模糊查询区分大小写的实例
Sep 29 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
七种PHP开发环境搭建工具
Jun 28 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
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
动态表格Table类的实现
2009/08/26 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
Python生成器generator用法示例
2018/08/10 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
利用python实现AR教程
2019/11/20 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
小学新学期教师寄语
2014/01/18 职场文书
实验室的标语
2014/06/20 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL