#javascript #node.js #puppeteer
#javascript #node.js #кукловод
Вопрос:
Я использую puppeteer для сканирования данных, на сайте есть несколько хитрых трюков, чтобы скрыть данные, поэтому мне нужно выполнить цикл while (нажимайте 2 кнопки непрерывно, пока данные не появятся в DOM и не станут видимыми).
Но у меня здесь проблема, я не могу проверить, отображаются ли данные, и остановить цикл.
Это код:
const puppeteer = require('puppeteer');
const iPhone = puppeteer.devices['iPhone X'];
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.emulate(iPhone);
await page.goto('https://website.com/abcXyZ/');
// countData is the number of the ul>li. When nothing show, its value is 0. When appeared, value is >0
const countData = await page.evaluate(() => document.getElementsByClassName('js-list')[0].getElementsByTagName('li').length)
while (countData < 1) {
await page.click('.btn1')
await page.waitForTimeout(600)
await page.click('.bt2')
await page.waitForTimeout(600)
const isFound = await page.evaluate(() => document.body.contains(document.querySelector('.goWork')))
if (isFound) break
}
await browser.close();
})();
Цикл выполняется только один раз и останавливается. Я хочу щелкнуть 2 btns, пока не появятся данные, и остановить цикл. Как я могу исправить этот код?
Спасибо
Ответ №1:
Есть много более простых способов сделать это, но это не ваш вопрос. Чтобы иметь возможность сказать, в чем проблема в вашем коде, нам нужно увидеть исходный код веб-страницы. Так что без этого я собираюсь сделать предположение.
const isFound = await page.evaluate(() => document.body.contains(document.querySelector('.goWork')))
if (isFound) break
Приведенный выше код проверяет , что тело страницы содержит элемент с именем класса goWork
. Если тело содержит его, вы разрываете цикл. Так что, возможно, в этом и заключается проблема. Похоже, что тело содержит элемент с goWork
классом.
Комментарии:
1. И можете ли вы дать мне решения, чтобы упростить его, мой код кажется сложным. URL-адрес веб-сайта, который я хочу просмотреть, выглядит следующим образом v.douyin.com/Jts3CQf . Вы должны посетить его как мобильное устройство, и если вы не видите данных, вам нужно нажимать кнопки (желтую) непрерывно, пока не появятся данные.
2. Вы можете использовать
waitForSelector
метод кукольника. Проверьте эту ссылку pptr.dev/…3. waitForSelector остановит цикл и будет ждать, в данном случае у меня это не работает. У меня есть вопрос, если вместо этого я использую метод http get request / fetch, будет ли он работать как кнопка нажатия?
4. Конечно
waitForSelector
, цикл остановится и будет ждать. Это то, что он делает. Вам нужно изменить свой код, чтобы работать с ним. Если вы пытаетесь щелкнуть ссылку и получить данные с этого URL, вы можете просто извлечь ее самостоятельно, не нажимая на нее. Он вернет вам исходный код URL-адреса. Вы можете попробовать сами и увидеть результат. Если вы хотите перейти к этому URL-адресу, вы можете просто использоватьawait page.goto(url)