使用spatie/crawler爬取JS渲染站点时无法获取渲染后HTML如何解决
解决spatie/crawler无法获取JS渲染后HTML的方案
你之前的配置没有给页面留足够的JS执行和渲染时间,爬虫在JS还没把DOM渲染出来就已经拉取了原始HTML内容,所以拿到的都是未渲染的脚本代码,按以下步骤调整即可:
- 给Browsershot配置页面等待规则,确保JS执行完成、目标元素渲染出来再返回内容。推荐优先使用等待指定元素加载的方案,比固定等待更高效稳定:
$crawler = Crawler::create(); $browsershot = new Browsershot(); $browsershot->noSandbox() // 等待页面基础加载完成 ->waitForFunction('document.readyState === "complete"') // 等待你需要的登录表单元素渲染完成,最多等待5000毫秒 ->waitForSelector('#loginform', 5000) // 可选:如果页面依赖大量接口渲染,加这行等所有网络请求结束 ->waitUntilNetworkIdle(); $crawler->setBrowsershot($browsershot); $crawler ->executeJavaScript() ->ignoreRobots() ->setCrawlObserver(new Observer()) ->startCrawling($url);
- 确认获取内容的位置正确:渲染后的完整HTML会直接包含在
CrawlObserver的crawled方法传入的$response对象中,在该方法内调用$response->getBody()->getContents()即可拿到渲染完成的内容,不要在爬虫执行结束后调用未关联渲染上下文的响应对象。
内容的提问来源于stack exchange,提问作者Ewen Choon
相关产品推荐
相关产品推荐

