javascript - 无法在 node.js 控制台上打印 puppeteer 响应
问题描述
我正在抓取一个网站进行练习,我正在使用 Puppeteer 作为无头浏览器。我的问题是控制台在 node.js 控制台上记录 puppeteer 响应。
我的目标是产品的 DOM 中的父元素,并从每个元素中检索某些信息。使用谷歌开发工具,我所有的查询选择器都是正确的,我可以毫无问题地打印我想要的数据。但是,当尝试打印到我的 node.js 控制台时,我总是得到一个空白数组作为响应。
const puppeteer = require('puppeteer');
let scrape = async () => {
const masterList = [];
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
await page.goto('https://www.fschumacher.com/catalog/Wallcoverings?sid=0.07316907031133635');
const result = await page.evaluate(() => {
return document.querySelector('.search-results-parent').querySelectorAll('.product-preview');
});
[].forEach.call(result, (el) =>{
let thumbnail = el.querySelector('.product-thumb')
.querySelector('a')
.querySelector('img')
.src;
let product_info = el.querySelector('.product-info').querySelector('div');
let product_name = product_info.querySelector('a').querySelector('div').innerText;
let product_id = product_info.querySelector('.product-id');
let product_color = product_id.querySelector('.product-color').innerText;
let product_sku = product_id.querySelector('.product-sku').innerText;
let product_price = product_info.querySelector('.product-price')
.querySelector('span')
.innerText;
let whole = {
thumbnail,
product_name,
product_color,
product_sku,
product_price
};
masterList.push(whole);
});
browser.close();
return masterList;
};
scrape().then((res) => {
console.log(res);
});
我希望在 Goggle 开发工具中看到的数据会出现在我的 node.js 控制台上。
解决方案
问题是您运行的所有内容都[].forEach.call(result, (el) =>{
在您的 Node 进程中运行,而不是在 Chromium 中。因此,诸如此类的事情el.querySelector('.product-thumb')
将不起作用,因为此时您与 Chromium 已“断开连接”。
好消息是,您可以通过将更多代码移至 Chromium 端来解决此问题:
const mainResult = await page.evaluate(() => {
const masterList = [];
var result = document.querySelector('.search-results-parent').querySelectorAll('.product-preview');
[].forEach.call(result, (el) =>{
let thumbnail = el.querySelector('.product-thumb')
.querySelector('a')
.querySelector('img')
.src;
let product_info = el.querySelector('.product-info').querySelector('div');
let product_name = product_info.querySelector('a').querySelector('div').innerText;
let product_id = product_info.querySelector('.product-id');
let product_color = product_id.querySelector('.product-color').innerText;
let product_sku = product_id.querySelector('.product-sku').innerText;
let product_price = product_info.querySelector('.product-price')
.querySelector('span')
.innerText;
let whole = {
thumbnail,
product_name,
product_color,
product_sku,
product_price
};
masterList.push(whole);
});
return masterList;
});
browser.close();
return mainResult;
推荐阅读
- r - 根据 R 中的组对值进行归一化
- python - Python - 检查大型嵌套字典中是否存在键
- java - StringBuilder 删除方法无法删除 for 循环中的所有 '0'
- haskell - 如何从类型中导入某些功能
- node.js - 带有 node.js express 的 AWS lambda api 网关返回“net::ERR_CONTENT_DECODING_FAILED 200”错误
- react-native - 如何在后台 GPS 跟踪中设置间隔?
- c# - 在 Xamarin 中选择 CardView
- xamarin - Xamarin:绑定到 ImageSource 属性不起作用
- flutter - 颤振按钮图标不随音频播放器改变
- r - 因变量中缺少数据的回归模型