将网页抓取功能集成到Google Home项目时数据为空的问题求助
解决Firebase Functions中Webhook数据抓取返回null的问题
看起来你遇到的是很典型的「本地调试正常,部署到云端就失效」的问题,结合你的描述,我整理了几个最可能的原因和对应的解决方案:
1. 目标网站拦截了云端请求
很多网站会校验请求的User-Agent标识,Firebase Functions默认的请求UA会被识别为非浏览器请求,导致返回空内容或错误页面。你可以在请求中添加模拟浏览器的UA头来绕过这个限制:
// 修改你的request请求部分,添加headers配置 request({ url: "http://books.toscrape.com", headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } }, function(error, response, body) { // 原有逻辑... // 新增日志,部署后查看返回的内容片段,排查是否拿到正确页面 console.log("Response body snippet:", body?.slice(0, 500)); });
2. 替换已废弃的request库
request库已经被官方标记为废弃,Firebase Functions的Node.js运行环境可能存在兼容性问题。建议改用axios或node-fetch这类仍在维护的HTTP库:
先安装依赖
npm install axios
改写抓取逻辑(适配Firebase的异步处理)
const functions = require('firebase-functions'); const axios = require('axios'); const cheerio = require('cheerio'); // 你的Webhook函数示例 exports.scrapeAndRespond = functions.https.onRequest(async (req, res) => { try { // 发起请求并带上UA头 const response = await axios.get("http://books.toscrape.com", { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } }); console.log("请求状态码:", response.status); console.log("返回内容片段:", response.data.slice(0, 500)); // 解析页面 const $ = cheerio.load(response.data); const categoryList = []; // 注意:原选择器可能存在冗余,这里简化适配目标网站结构 $('ul.nav.nav-list li ul li a').each(function() { const category = $(this).text().trim(); categoryList.push(category); }); // 返回给Google Assistant的纯文本响应 res.json({ fulfillmentText: `当前抓取到的分类有:${categoryList.join('、')}` }); } catch (error) { console.error("抓取出错:", error.message); res.json({ fulfillmentText: "抱歉,暂时无法获取数据,请稍后再试" }); } });
3. 确保Firebase函数正确处理异步操作
如果你的Webhook函数是用传统回调方式编写的,可能会出现「函数在请求完成前就提前结束」的情况,导致返回null。改用async/await语法可以确保函数等待抓取完成后再返回结果。
4. 查看Firebase Functions日志
部署后一定要去Firebase控制台的「函数」→「日志」板块查看详细输出:
- 如果看到
response.statusCode是403/404,说明请求被拦截或目标地址有误 - 如果
body是空白或错误页面,就对应上面的UA或HTTP库问题
按照这些步骤排查,应该能解决你遇到的数据返回null的问题。
内容的提问来源于stack exchange,提问作者Giorgio Maritano
相关产品推荐
相关产品推荐

