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

2020-05-25 18:35:00 987 技术小虫有点萌 技术小虫有点萌
  • 前几天看了一下swoole,今天找到了使用场景,就简单写一个demo
  • swoole安装教程》》之前分享过,自己去公众号找一下
  • 本文是 php利用swoole协程启动多个子进程模式,根据服务器配置实现子进程自定义数量,从而 避免因进程过多导致服务器卡死(本人已经历)
  • demo场景,爬取10w+个网页内容
  • 脚本test1.php内容
<?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

  • 查看命令行输出结果

image
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);
        }
    
image
image
image
image
  • 请求1000次,时间一共是144秒,里面还有几次sleep的时间,如果去掉sleep,真实时间48s,当然,逻辑业务不一样,时间也不一样

    process-start-time:20200525 18:25:36
    process-end-time:20200525 18:26:24
    
    • 看一下我爬取的数据 1000条没毛病
image
image