【问题标题】:Dynamic Web Scraping not returning a complete NodeList动态 Web 抓取未返回完整的 NodeList
【发布时间】:2021-11-03 14:02:23
【问题描述】:

我试图在动态 html 中提取 span 标签的内容,但是当我使用 querySelectorAll 时,它只返回 NodeList 中第一个元素的 _prevClass,没有别的。

我的代码:

const Nightmare = require('nightmare');

const nightmare = Nightmare({ show: true });
const url = 'https://mir4draco.com/price';

nightmare
    .goto(url)
    .evaluate(() => document.querySelectorAll('span.amount')) // Should return a NodeList with 5 elements
    .end()
    .then(response => {
        console.log(response);
    }).catch(error => {
        console.error('Search failed:', error);
    });

输出:

{ '0': { _prevClass: 'amount' } }

This is the output in the browser

【问题讨论】:

  • 运行时你登录了吗?我刚刚访问了该页面,并且您的查询下只有一个元素没有登录,这是有道理的。
  • 不,我在私人标签上运行它,未登录或启用扩展
  • 那就是你的问题了。如果我访问页面 (imgur.com/a/BnRAOhg),则只有一个元素与查询 span.amount 匹配。您可能需要登录才能查看所需的所有数据。
  • 我现在在私人标签中查询span.amount,它给了我相同的结果(imgur.com/SjBevwC),登录只显示一些个人详细信息,我想要的数据可用于大家,登录与否
  • 当你没有得到你想要的结果时,看看你是否可以检查控制台。我从页面收到 CORS 错误,可能是您的噩梦实例也是如此。

标签: node.js web-scraping dom


【解决方案1】:

好吧,经过一些测试,我得到了解决方案。

由于某种原因,此站点仅在使用自动化时几秒钟后才加载我需要的标签。

所以,我改成了 puppeteer 并使用了 slowMo 参数。

现在完美运行


const puppeteer = require('puppeteer');

const url = 'https://mir4draco.com/price'

const precoDraco = async function () {

    const browser = await puppeteer.launch({ slowMo: 10000 });
    const page = await browser.newPage();
    await page.goto(url);

    var prices = await page.evaluate(() => {
        var div = document.querySelectorAll('span.amount');

        var prices = "";
        div.forEach(element => {
            if (element != null) prices += element['innerText'] + " ";
        });
        return prices;
    })
    browser.close();
}

现在可以正常工作了

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    相关资源
    最近更新 更多