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 相关文章推荐
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
Jul 09 PHP
adodb与adodb_lite之比较
Dec 31 PHP
用PHP实现维护文件代码
Jun 14 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
如何用C语言编写PHP扩展的详解
Jun 13 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
php将图片文件转换成二进制输出的方法
Jun 10 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP的简单跳转提示的实现详解
Mar 14 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
smarty实例教程
2006/11/19 PHP
php数字游戏 计算24算法
2012/06/10 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
JS typeof fn === 'function' &amp;&amp; fn()详解
2020/08/22 Javascript
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python中的time模块与datetime模块用法总结
2016/06/30 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
python3 实现调用串口功能
2019/12/26 Python
Python pandas库中的isnull()详解
2019/12/26 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
调解员先进事迹材料
2014/02/07 职场文书
骨干教师考核方案
2014/05/09 职场文书
中职招生先进个人材料
2014/08/31 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL