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

PHP批量下载网页图片遇阻:无法获取延迟加载的img标签

解决PHP静态抓取无法获取延迟加载图片的问题

你猜的没错!这个网站的图片确实是JavaScript动态渲染的——用file_get_contents或者普通curl请求只能拿到服务器返回的初始HTML,这时候图片还没被JS加载出来,自然看不到<img>标签。

下面给你两种可行的解决方案,从易用到进阶都有:

方案一:用无头浏览器模拟真实浏览器渲染(最通用)

这类工具能像真实浏览器一样执行页面里的JS,获取完全渲染后的页面内容。PHP里最方便的是使用spatie/browsershot,它基于Puppeteer(Chrome无头浏览器)。

步骤1:安装依赖

首先确保你的环境里有Node.js和npm,然后安装包:

composer require spatie/browsershot
npm install puppeteer

步骤2:编写代码获取渲染后的页面

require 'vendor/autoload.php';

use Spatie\Browsershot\Browsershot;

// 生成渲染后的HTML(等待JS执行完成)
$html = Browsershot::url('https://www.tumbex.com/memes.tumblr/posts?page=2')
    ->waitUntilNetworkIdle() // 等待网络请求完成,确保图片加载
    ->bodyHtml();

// 现在你可以在$html里找到完整的<img>标签了
echo $html;

方案二:分析网站的API接口(更高效)

如果不想依赖无头浏览器,可以抓包分析网站加载图片的接口。比如打开浏览器开发者工具,看Network面板里的XHR请求,找到加载图片数据的API,直接用curl请求这个接口拿到图片URL列表。

举个例子(需要你自己实际抓包确认):

$apiUrl = 'https://www.tumbex.com/api/xxx/posts?page=2'; // 替换成实际的API地址
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);

// 解析JSON数据拿到图片URL
$imageData = json_decode($response, true);
foreach ($imageData['posts'] as $post) {
    echo $post['image_url'] . "<br>";
}

注意:网站的API接口可能会随时变化,需要你自己抓包验证,而且可能需要处理请求头、Cookie等验证信息。

为什么你的原有代码不行?

你的file_get_contents和自定义curl函数都是静态HTTP请求,只会获取服务器返回的初始HTML文档,不会执行页面中的JavaScript代码。而现代很多网站用JS动态加载图片、内容,所以静态抓取拿不到最终渲染后的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:22:36