我正在抓取一个网站来练习,我正在使用Puppeteer作为一个无头浏览器。我的问题是在node.js控制台上记录木偶操纵者的响应。
我的目标是产品的DOM中的一个父元素,并从每个元素中检索某些信息。使用谷歌开发工具,我所有的querySelectors都是正确的,我可以打印我想要的数据,没有问题。但是,当尝试打印到我的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);
});我希望在谷歌开发工具中看到的数据会出现在我的node.js控制台上。
发布于 2019-06-18 20:12:11
问题是你在[].forEach.call(result, (el) =>{之后运行的所有东西都是在你的节点进程中运行的,而不是在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;https://stackoverflow.com/questions/56644080
复制相似问题