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的库,结果发现很多东西
Dec 31 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
May 02 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
php实现图片添加水印功能
Feb 13 PHP
php多文件上传实现代码
Feb 20 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
php显示时间常用方法小结
Jun 05 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
各种快递查询--Api接口
Apr 26 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
Thinkphp集成抖音SDK的实现方法
Apr 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
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
Python不规范的日期字符串处理类
2014/06/10 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
python实现udp传输图片功能
2020/03/20 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
大学校园活动策划书
2014/02/04 职场文书
三八妇女节活动总结
2014/05/04 职场文书
项目经理任命书内容
2014/06/06 职场文书
公司任命书模板
2014/06/06 职场文书
改革共识倡议书
2014/08/29 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
学校工会工作总结2015
2015/05/19 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
Python实现byte转integer
2021/06/03 Python
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL