如何使用Goutte将所有爬取的帖子数据存入数组?
批量抓取帖子并存入数组的解决方案
你的代码目前只提取了单条帖子数据,是因为直接对节点集合调用text()只会返回第一个匹配节点的内容。要实现批量抓取,需要遍历所有帖子节点,逐个提取字段后存入数组,具体修改如下:
$httpBrowser = new HttpBrowser(); $request = $httpBrowser->request('GET', $url); // 获取页面中所有帖子的容器节点集合 $postNodes = $request->filter('.works'); $postsArr = []; // 遍历每个帖子节点,提取数据并批量存入数组 $postNodes->each(function ($node) use (&$postsArr) { // 从当前帖子节点内提取字段,添加存在性判断避免报错 $postTitle = $node->filter('.works__post')->exists() ? $node->filter('.works__post')->text() : ''; $content = $node->filter('.works__content')->exists() ? $node->filter('.works__content')->text() : ''; $date = $node->filter('.works__header-details--date')->exists() ? $node->filter('.works__header-details--date')->text() : ''; // 将单条帖子数据加入总数组 $postsArr[] = [ 'post_title' => $postTitle, 'content' => $content, 'date' => $date ]; }); // 最终$postsArr即为所有帖子的批量数据
关键逻辑说明
- 获取节点集合:
$request->filter('.works')会返回页面中所有匹配.works的节点(假设每个.works对应一个帖子容器),而不是单个节点。 - 遍历节点:使用DomCrawler的
each()方法遍历每个帖子节点,确保每个字段都从当前帖子的上下文内提取,避免混淆不同帖子的内容。 - 异常防护:添加
exists()判断,防止部分帖子缺少指定字段时抛出异常,提升爬虫的稳定性。 - 批量存储:每次遍历将单条帖子的数组推入总数组
$postsArr,最终得到所有帖子的结构化数据。
如果页面中帖子的容器选择器不是.works,请根据实际HTML结构调整最外层的筛选器,核心逻辑保持不变。
内容的提问来源于stack exchange,提问作者programs23
相关产品推荐
相关产品推荐

