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,多线程
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于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
![](https://img.aspxhome.com/file/2023/0/112400_0s.png)
解决django框架model中外键不落实到数据库问题
2024-01-13 20:36:12
![](https://img.aspxhome.com/file/2023/3/99123_0s.jpg)
Python代码执行时间测量模块timeit用法解析
2023-06-13 16:14:04
![](https://img.aspxhome.com/file/2023/7/117567_0s.png)
如何避免查询调查结果时出现不相关主题的重复记录?
2009-11-07 18:42:00
vue项目部署到Apache服务器中遇到的问题解决
2024-05-22 10:42:36
![](https://img.aspxhome.com/file/2023/8/123218_0s.png)
ElementUI 的 Tree 组件的基本使用实战教程
2024-04-26 17:40:46
![](https://img.aspxhome.com/file/2023/1/133131_0s.png)
在keras下实现多个模型的融合方式
2023-06-03 17:14:59
![](https://img.aspxhome.com/file/2023/5/77755_0s.jpg)
vue中的循环对象属性和属性值用法
2024-04-28 09:25:36
![](https://img.aspxhome.com/file/2023/8/133028_0s.jpg)
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
![](https://img.aspxhome.com/file/UploadPic/20107/9/verified-47s.gif)
如何取得表中字段的属性?
2010-01-18 20:52:00
python算法学习之桶排序算法实例(分块排序)
2022-09-08 13:11:33
windows安装TensorFlow和Keras遇到的问题及其解决方法
2022-04-04 02:14:23
![](https://img.aspxhome.com/file/2023/3/67803_0s.png)