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+AJAX聊天程序[聊天室]提供下载
Jul 21 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
spl_autoload_register与autoload的区别详解
Jun 03 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
Jun 18 PHP
php curl模拟post请求小实例
Nov 13 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 PHP
PHP session 会话处理函数
Jun 06 PHP
ZendFramework2连接数据库操作实例
Apr 18 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 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
晶体管来复再生式二管收音机
2021/03/02 无线电
php控制文件下载速度的方法
2015/03/24 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
Python列表推导式的使用方法
2013/11/21 Python
python字符串替换的2种方法
2014/11/30 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
护理学毕业生自荐信
2013/10/02 职场文书
金融专业应届生求职信
2013/11/02 职场文书
中学教师培训制度
2014/01/31 职场文书
运动会入场词200字
2014/02/15 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
环保建议书范文
2015/09/14 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python