You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP网页爬虫无报错但未执行循环及生成输出问题排查

问题排查与修复方案

核心致命错误:提前调用getResponse()

你在还未发起任何HTTP请求时,就调用了$client->getResponse()——此时Client对象还未发送任何请求,getResponse()会返回null,后续调用->getStatus()会触发致命错误(你说未报错大概率是环境错误级别设置问题),脚本直接执行exit(),导致后续循环、文件生成逻辑完全没机会运行。

修复方法:把响应状态判断移到循环内部的每次请求之后,或者通过异常捕获来处理请求失败场景。

其他关键问题与优化点

  • 缺乏错误捕获机制:Goutte请求失败时会抛出RuntimeException,无捕获逻辑会导致脚本静默崩溃,看不到任何错误提示
  • 无执行进度反馈:脚本全程无输出,即使正常运行也无法感知状态,建议添加进度提示
  • 文件写入权限验证:Gitpod环境中需确保当前目录有写入权限,避免生成CSV失败
  • DOM选择器容错:目标页面元素不存在时,filter()->text()或attr()会抛出异常,需先判断元素是否存在再提取数据

修复后的完整代码

<?php
if (file_exists('vendor/autoload.php')) {
    require 'vendor/autoload.php';
}
use Goutte\Client;

$client = new Goutte\Client();
$data = array();

// 检查当前目录写入权限
if (!is_writable(getcwd())) {
    echo '当前目录无写入权限,无法生成CSV文件';
    exit();
}

try {
    for ($i = 0; $i < 3; $i++) {
        echo "正在爬取第 " . ($i+1) . " 页...\n";
        $url = 'https://ec.europa.eu/info/law/better-regulation/have-your-say/initiatives_de?page=' . $i;
        $crawler = $client->request('GET', $url);

        // 验证响应状态
        $status = $client->getResponse()->getStatus();
        if ($status != 200) {
            echo "第 {$i+1} 页请求失败,状态码:{$status}\n";
            continue;
        }

        $crawler->filter('.initiative')->each(function ($node) use (&$data) {
            // 容错处理:先判断元素是否存在
            $title = $node->filter('h3')->count() ? $node->filter('h3')->text() : '无标题';
            $link = $node->filter('a')->count() ? $node->filter('a')->attr('href') : '无链接';
            $description = $node->filter('p')->count() ? $node->filter('p')->text() : '无描述';
            $deadline = $node->filter('time')->count() ? $node->filter('time')->attr('datetime') : '无截止日期';

            $data[] = array($title, $link, $description, $deadline);
        });

        $sleep = rand(5,10);
        echo "等待 {$sleep} 秒...\n";
        sleep($sleep);
    }

    // 写入CSV文件
    $fp = fopen('initiatives.csv', 'w');
    fputcsv($fp, array('Title', 'Link', 'Description', 'Deadline'));
    foreach ($data as $row) {
        fputcsv($fp, $row);
    }
    fclose($fp);

    echo "爬取完成,共获取 " . count($data) . " 条数据,已保存到 initiatives.csv\n";
} catch (Exception $e) {
    echo "脚本执行出错:" . $e->getMessage() . "\n";
}
?>

验证步骤

  1. 在Gitpod终端执行脚本:php 你的脚本文件名.php
  2. 查看终端输出的进度提示
  3. 检查当前目录下是否生成initiatives.csv文件

内容的提问来源于stack exchange,提问作者JRGN1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:02:43