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

Firebase Cloud Functions问题:已指定欧洲区域,爬虫函数仍运行在美国服务器

问题分析与解决方案

看起来你的函数确实部署在了法兰克福(europe-west3)区域,但目标网站(bwin)并不是根据函数的部署区域来判断访问者地域,而是通过HTTP请求头、时区设置、IP地理归属这些更细节的标识来返回对应区域的内容。从爬取结果的赔率格式差异来看,网站把你的爬虫请求识别成了美国地区访问,所以返回了美式金钱线格式。

第一步:先确认函数的实际运行区域

先做个简单验证,确保函数真的在法兰克福运行。在你的scraper.js里添加一段代码,打印函数的出口IP并检查归属地:

const fetchData = async (url) => { 
  const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], }); 
  // 新增:检查出口IP
  const ipPage = await browser.newPage();
  await ipPage.goto('https://icanhazip.com/');
  const ipText = await ipPage.evaluate(() => document.body.textContent.trim());
  console.log(`函数出口IP: ${ipText}`);
  await ipPage.close();

  // 原有爬虫逻辑
  const page = await browser.newPage(); 
  await page.goto(url); 
  // ... 剩余代码不变
}

部署后查看Cloud Functions日志,把打印的IP放到IP归属地查询工具里验证:

  • 如果IP属于德国法兰克福,说明问题出在请求标识上;
  • 如果IP是美国的,那可能是部署配置有遗漏(但你已确认控制台设置正确,这种概率很低)。

第二步:修改Puppeteer请求,模拟德国地区访问

针对bwin这类网站,主要通过以下几个维度识别地域,我们逐个模拟:

1. 设置德国地区的HTTP请求头

在page.goto时添加语言和地区相关的请求头:

await page.goto(url, {
  headers: {
    'Accept-Language': 'de-DE,de;q=0.9,en;q=0.8', // 优先德语
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
  }
});

2. 设置页面时区与浏览器语言

Puppeteer默认时区可能是UTC或美国时区,我们强制设置为柏林时区,并修改浏览器的语言标识:

const browser = await puppeteer.launch({
  headless: true,
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--timezone=Europe/Berlin' // 直接设置浏览器时区
  ],
});

const page = await browser.newPage();
// 修改浏览器语言标识
await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, 'language', { get: () => 'de-DE' });
  Object.defineProperty(navigator, 'languages', { get: () => ['de-DE', 'de', 'en'] });
});

3. 模拟欧洲用户的User-Agent(可选)

部分网站会通过User-Agent判断设备和地域,你可以使用一个贴近欧洲用户的Chrome UA:

await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36');

第三步:验证修改结果

把以上修改整合后重新部署函数,再测试爬取结果。此时网站应该会识别到你的请求来自德国,返回你预期的倍数格式赔率。

补充说明:Cloud Functions的区域设置确实决定了函数的运行服务器位置,但出口IP属于GCP对应区域的IP池,只要IP是欧洲的,再配合正确的请求标识,就能触发网站返回对应区域的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:42:34