Puppeteer部署至GAE后不加载JS、图片资源,本地正常(Shopify站点尤甚)
检查GAE的出站请求规则
GAE标准环境默认对出站请求有域名限制,Shopify站点的资源大多托管在第三方CDN(比如cdn.shopify.com、shopifycloud.com这类),如果app.yaml里没配置允许这些域名的请求,GAE会直接拦截,连请求都发不出去。你可以在app.yaml里添加urlfetch配置,放开所有外部域名:runtime: nodejs20 urlfetch: allow_http: true allowed_domains: - "*"另外,GAE的urlfetch有默认超时时间(60秒),如果资源加载慢,也可能导致请求被切断,可在
app.yaml里延长超时:url_fetch_timeout_sec: 120解除Chromium在GAE沙箱的限制
GAE的运行沙箱会限制Chromium的部分功能,比如默认启用的资源节流、安全策略,可能导致资源加载被阻断。启动Puppeteer时加这些参数试试:const browser = await puppeteer.launch({ args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-web-security', '--allow-running-insecure-content', '--disable-features=VizDisplayCompositor,site-per-process' ], headless: 'new' // 用新版无头模式,兼容性更好 });同时强制关闭资源节流:
await page.emulateNetworkConditions({ offline: false, downloadThroughput: 10 * 1024 * 1024, // 模拟高速网络 latency: 0 });补全请求头,规避反爬检测
即使你觉得本地和GAE的请求头一致,也可能存在隐藏差异——GAE环境的Chromium可能会自动添加代理相关的头,或者Shopify通过IP识别到是云服务器(GAE的IP属于爬虫高发段),直接屏蔽资源。你可以强制设置和本地完全一致的请求头,同时伪装浏览器环境:await page.setExtraHTTPHeaders({ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' }); // 隐藏webdriver标识,避免被反爬识别 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => false }); });升级GAE实例配置
资源密集型网站需要足够的内存和CPU,GAE默认的F1实例内存只有256MB,Chromium加载大页面时容易因为内存不足终止资源加载。把实例类升级到F2或更高,在app.yaml里配置:instance_class: F2 resources: cpu: 2 memory_gb: 2排查构建包的隐性差异
虽然你用了相同的构建包,但GAE部署时可能会自动替换Puppeteer依赖的Chromium二进制文件(适配云环境的版本),导致和本地运行的Chromium不一致。可以在package.json里锁定Puppeteer和Chromium的版本,比如:"dependencies": { "puppeteer": "20.7.4", "puppeteer-core": "20.7.4" }并且部署时禁用GAE的自动依赖更新,确保本地和云端的依赖完全一致。
内容的提问来源于stack exchange,提问作者user28655470

