我有一个应用程序,它接受纽约时报食谱网址,并将成分列表转换为购物待办事项列表。
因为“纽约时报”使用React,所有数据都不能通过标准抓取获得 - index.html大部分是空白的。我必须使用像NightmareJS这样的库,它使用Electron浏览器来完全构造DOM(包括Javascript),这样我就可以抓取构造的DOM来获取数据。
但这似乎不起作用。这是我在/functions/index.js文件中包含的代码:
// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions')
// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)
const Nightmare = require('nightmare')
const Actions = require('nightmare-react-utils').Actions
exports.listify = functions.https.onRequest((req, res) => {
console.log("YOU ARE NOW INSIDE THE LISTIFY FUNCTION!")
Nightmare.action(...Actions)
const nightmare = new Nightmare({ show: false })
const selector = 'ul.recipe-ingredients'
const queryUrl = req.query.url
nightmare
.goto(queryUrl)
.wait()
.evaluate((selector) => {
console.log("YOU ARE NOW INSIDE THE EVALUATE!")
const recipeIngredientsObject = document.querySelector(selector).children
const result = []
const ingredientKeys = Object.keys(recipeIngredientsObject)
ingredientKeys.forEach((key) => {
const ingredientObject = recipeIngredientsObject[key]
const quantityAndIngredient = ingredientObject.children
result.push({
"quantity": quantityAndIngredient[0].innerText,
"ingredient": quantityAndIngredient[1].innerText
})
})
return result
}, selector)
})
当我从我的前端调用此函数时,我在Firebase日志中看到第一个控制台日志 - “你现在正处于LISTIFY FUNCTION中!” - 但我没有看到第二条消息:“你现在正在评估中!”
我可以不将NightmareJS与Firebase功能一起使用吗?
答案 0 :(得分:0)
将不会出现console.log消息。运行evaluate时,该函数在无头浏览器的上下文中执行,因此不会登录到终端。
尝试类似......
.evaluate((selector) => {
return document.querySelector(selector)
}, selector)
.end()
.then(console.log)
看它是否有效。