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 Rename 更改文件、文件夹名称
May 24 PHP
php使用qr生成二维码的示例分享
Jan 20 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
May 15 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
php微信开发之谷歌测距
Jun 14 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 PHP
laravel orm 关联条件查询代码
Oct 21 PHP
PHP数组array类常见操作示例
May 15 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 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(1) php开发环境配置
2010/02/15 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
JavaScript中textRange对象使用方法小结
2015/03/24 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
javascript时间差插件分享
2016/07/18 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python网络编程学习笔记(四):域名系统
2014/06/09 Python
RC4文件加密的python实现方法
2015/06/30 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
台湾森森购物网:U-mall
2017/10/16 全球购物
幼儿园秋游感想
2014/03/12 职场文书
微笑服务标语
2014/06/24 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
《称赞》教学反思
2016/02/17 职场文书
vue中div禁止点击事件的实现
2022/04/02 Vue.js