PHP DOM Crawler是否有方法可点击网页元素加载更多内容?
爬虫点击加载更多按钮实现方案
你当前使用的Goutte客户端仅支持发送HTTP请求获取静态HTML,无法执行页面内的JavaScript逻辑,而你要点击的a标签绑定的是JS触发的加载事件,因此原生Goutte无法实现点击加载更多的操作,可选择以下两种方案实现需求:
方案1:使用支持JS运行的无头浏览器库Panther
该方案和你现有Crawler语法兼容,改动量小,适合不想抓接口的场景。
- 第一步:安装依赖
composer require symfony/panther
- 第二步:替换原有代码,实现循环点击加载
<?php require __DIR__.'/vendor/autoload.php'; use Symfony\Component\Panther\Client; $url = "https://www.thegioididong.com/dtdd"; // 初始化Chrome无头客户端 $client = Client::createChromeClient(); $crawler = $client->request('GET', $url); // 循环点击直到加载更多按钮隐藏 while (true) { $viewMore = $crawler->filter('div.view-more'); // 判断是否还有更多可加载 if ($viewMore->count() === 0 || str_contains($viewMore->attr('style'), 'display: none')) { break; } // 点击加载更多按钮 $client->click($viewMore->filter('a')->link()); // 等待页面加载完成,避免重复点击 $client->waitForStaleness($viewMore); $crawler = $client->getCrawler(); } // 此处编写你提取全部商品数据的逻辑
方案2:直接抓AJAX接口(效率更高)
你可以通过浏览器F12开发者工具的网络面板,点击加载更多按钮时捕获对应的AJAX请求,直接循环调用该接口获取商品数据。这种方式不需要启动浏览器,运行速度更快,资源占用更低:
- 点击加载更多时找到对应请求接口,一般会携带页码、分页数量参数
- 循环修改分页参数发送请求,解析返回的JSON数据即可拿到全量商品
内容的提问来源于stack exchange,提问作者duclong
相关产品推荐
相关产品推荐

