爬取网页数据php,不到40行代码教你如何利用php高效快速的爬取10w+网页数据

前几天看了一下swoole,今天找到了使用场景,就简单写一个demo

swoole安装教程》》之前分享过,自己去公众号找一下

本文是 php利用swoole协程启动多个子进程模式,根据服务器配置实现子进程自定义数量,从而 避免因进程过多导致服务器卡死(本人已经历)

demo场景,爬取10w+个网页内容

脚本test1.php内容

/**

* Created by PhpStorm.

* User: zhangguofu

* Date: 20/5/17

* Time: 上午12:31

*/

echo "process-start-time:" . date("Ymd H:i:s") . PHP_EOL;

$baseUrl = "http://www.baidu.com/";//自定义网页

$count = 1000;//为了方便演示,此处用1000意思一下

for ($i = 0; $i < $count; $i++) {

creatProcess($i, $baseUrl);

}

function creatProcess($i, $url)

{

// 每次过来统计一下进程数量

$cmd = "ps -ef |grep test1 |grep -v grep |wc -l";

$pCount = system($cmd);//进程数量

if ($pCount < 200) {

// 创建子进程

$process = new swoole_process(function (swoole_process $worker) use ($i, $url) {

$content = curlData($url);//方法里面处理你的逻辑

});

$pid = $process->start();

echo $url . '------第' . $i . '个子进程创建完毕'.PHP_EOL;

} else {

sleep(10);//可以根据实际情况定义

creatProcess($i, $url);

}

}

function curlData($url)

{

sleep(20);//为了让子进程多存在一段时间,让大家看到效果

$content = file_get_contents($url);

file_put_contents("./sData/baidu.txt","tttttttttttttttt".$content,FILE_APPEND);

}

echo "process-end-time:" . date("Ymd H:i:s");

执行 php test1

查看命令行输出结果

c3bf3f46bcb6

image

截图相关解释

子进程数量一直在200左右(满200我sleep了10s,所以不会一直是200)。大大提高效率

另写了一个监控脚本,每一秒输出一下进程数量

while (true){

echo "Time" . date("Ymd H:i:s").'----------';

sleep(1);

$cmd="ps -ef |grep test1 |grep -v grep |wc -l";

$ret1 = system($cmd);

}

c3bf3f46bcb6

image

c3bf3f46bcb6

image

请求1000次,时间一共是144秒,里面还有几次sleep的时间,如果去掉sleep,真实时间48s,当然,逻辑业务不一样,时间也不一样

process-start-time:20200525 18:25:36

process-end-time:20200525 18:26:24

看一下我爬取的数据 1000条没毛病

c3bf3f46bcb6

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值