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 相关文章推荐
推荐文章系统(一)
Oct 09 PHP
PHP实现网上点歌(二)
Oct 09 PHP
smarty实例教程
Nov 19 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
Jul 04 PHP
理解和运用PHP中的多态性[译]
Aug 02 PHP
php的hash算法介绍
Feb 13 PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
PHP实现微信提现功能(微信商城)
Nov 21 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写的基于Memcache的Queue实现代码
2011/11/27 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
javascript 主动派发事件总结
2011/08/09 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
webpack项目轻松混用css module的方法
2018/06/12 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
个人廉洁自律承诺书
2014/03/27 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
承诺函范文
2015/01/21 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
答辩状格式范本
2015/05/22 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
解决Go gorm踩过的坑
2021/04/30 Golang
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js