PHP使用CURL实现多线程抓取网页

作者:hebedich 时间:2024-06-05 09:48:25 

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,curl,多线程
0
投稿

猜你喜欢

  • 基于python实现数组格式参数加密计算

    2021-08-20 23:29:54
  • mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    2024-01-19 22:48:06
  • MySQL 查询速度慢的原因

    2024-01-25 01:10:27
  • ASP实现上传图片到数据库

    2007-09-21 12:59:00
  • 一篇文章带你了解python标准库--datetime模块

    2022-08-21 03:42:04
  • 解决django框架model中外键不落实到数据库问题

    2024-01-13 20:36:12
  • Python代码执行时间测量模块timeit用法解析

    2023-06-13 16:14:04
  • 如何避免查询调查结果时出现不相关主题的重复记录?

    2009-11-07 18:42:00
  • vue项目部署到Apache服务器中遇到的问题解决

    2024-05-22 10:42:36
  • ElementUI 的 Tree 组件的基本使用实战教程

    2024-04-26 17:40:46
  • 在keras下实现多个模型的融合方式

    2023-06-03 17:14:59
  • vue中的循环对象属性和属性值用法

    2024-04-28 09:25:36
  • 11个案例讲透Python函数参数小结

    2023-08-01 13:38:10
  • 深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复

    2023-11-06 19:25:27
  • python3 模拟登录v2ex实例讲解

    2022-09-23 00:42:53
  • iframe高度自适应,兼容IE,FF

    2008-06-18 12:15:00
  • 网购中的商品评价与口碑传播-译

    2010-07-09 13:44:00
  • 如何取得表中字段的属性?

    2010-01-18 20:52:00
  • python算法学习之桶排序算法实例(分块排序)

    2022-09-08 13:11:33
  • windows安装TensorFlow和Keras遇到的问题及其解决方法

    2022-04-04 02:14:23
  • asp之家 网络编程 m.aspxhome.com