Я пытаюсь извлечь все пароли из таблицы на веб-сайте https://www.passwordrandom.com / самые популярные-пароли. Я только пытаюсь вытащить второй элемент в каждый td, кроме первого tr. Когда я запускаю код, все в массиве оказывается нулевым.

Я пробовал возиться с селектором, но не совсем уверен, что с ним делать. Я думаю, что аргументы неверны, но не знаю, как это должно выглядеть.

const puppeteer = require('puppeteer')
const fs = require('fs')

const baseURL = 'https://www.passwordrandom.com/most-popular-passwords'

async function scrape() {
    const browser = await puppeteer.launch()

    const page = await browser.newPage()
    console.log('Puppeteer Initialized')

    await page.goto(baseURL)

    const allNodes = await page.evaluate(() => {
        return document.querySelectorAll("#cntContent_lstMain tr:not(:first-child) td:nth-child(2)")
    })

    const allWords = []

    for (let row in allNodes)
        allWords.push(allNodes[row].textContent)

    console.log(allWords)

    await browser.close();
}

scrape()

По сути, результатом должен быть массив, содержащий каждый пароль в таблице. Пароли помогают во втором элементе каждого td, кроме первого tr (как я уже говорил выше).

0
RockyS 15 Окт 2019 в 01:40

1 ответ

Лучший ответ

Код внутри page.evaluate выполняется внутри браузера, код снаружи - на узле.

Когда вы возвращаете элементы с помощью document.querySelectorAll, он возвращает NodeList, который затем сериализуется, а данные теряются (или на них ссылаются по-другому) из-за сериализации. Это означает, что allNodes[row].textContent не будет работать.

Самый простой способ - вернуть данные из page.evaluate.

const allNodes = await page.evaluate(() => {
  const elements = [...document.querySelectorAll("#cntContent_lstMain tr:not(:first-child) td:nth-child(2)")]
  return elements.map(element=>element.textContent)
})

Он предоставит вам textContent для всех доступных элементов с этим селектором.

1
Md. Abu Taher 15 Окт 2019 в 02:55