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 相关文章推荐
substr()函数中文版
Oct 09 PHP
与数据库连接
Oct 09 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
php中截取中文字符串的代码小结
Jul 17 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
PHP常见漏洞攻击分析
Feb 21 PHP
PHP在线打包下载功能示例
Oct 15 PHP
swoole_process实现进程池的方法示例
Oct 29 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
利用express启动一个server服务的方法
2017/09/17 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
水产养殖学应届生求职信
2013/09/29 职场文书
保险专业大专生求职信
2013/10/26 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
基层党建工作简报
2015/07/21 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript