Почему он возвращает только 11 моего цикла, когда я очищаю с помощью puppeteer? Нажимайте кнопку «Показать больше», пока не дойдете до конца

#puppeteer

#puppeteer

Вопрос:

У меня есть этот код: с URL-адресом:block.hacash.org

Я использую Puppeteer в Firefox, без головы, размещенный на VPS.

 
function hacdName() {
  const extractedElements = document.querySelectorAll('td.t2.gray.dts');
  const items = [];
  for (let element of extractedElements) {
    items.push(element.innerText);
  }
  return items;
}
let items = await page.evaluate(hacdName);
console.log(items)
  
  

Однако вывод вернет только первые 10 (десять) td.t2.gray.dts и не вернет остальные.

Пример:

[ ‘00000000097f5ff183be …’, ‘0000000019bcba6a3eae …’, ‘0000000014895c593f29 …’, ‘00000000077088d50229 …’, ‘0000000001a143b70894 …’, ‘0000000013c9089db9cb …’, ‘ 0000000006b7a707923c…’, ‘000000001bfa7c9c68ec…’, ‘00000000030593fa3c73…’, ‘000000001af596b772c5…’, ‘000000000394daca889b…’ ]

Как я могу очистить все td.t2.gray.dts до блока 0 или до тех пор, пока не израсходую всю show more кнопку.

Еще один вопрос :

Почему puppeteer при td.tr.gray.dts возврате (например, 000000000394daca889b …) возвращает не все (000000000394daca889b9f472f6ede90a9e835bc516d7f76f37718e5d827e6b2)?

Комментарии:

1. В вашем выходном массиве не 10, а 11 строк. если я перейду по указанному вами URL: по умолчанию есть только 11 элементов с этим селектором. если вам нужно больше: сначала нажмите кнопку «Показать больше». вы можете запустить puppeteer в режиме headful ( puppeteer.launch({ headless: false }) ), чтобы посмотреть, что у puppeteer в браузере.

2. спасибо, что указали, странно, что некоторое время назад я насчитал 15.

Ответ №1:

Чтобы получить все элементы с помощью Puppeteer, вам нужно сначала разместить их на странице, для этого вы можете создать функцию, которая будет нажимать на кнопку «Показать больше», пока она не станет видимой

 async function loadAllResources(page) {
  let moreButton;
  do {
    moreButton = await page.$('#blocks .pmore .button');
    if (moreButton) {
      await moreButton.click();
      await page.waitFor(1000); // some wait until the rows will be loaded
    }
  } while(moreButton)
}
  

и просто вызовите его перед очисткой всех данных await loadAllResources(page);

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

 function hacdName() {
  const extractedElements = document.querySelectorAll('td.t2.gray.dts a');
  const items = [];
  for (let element of extractedElements) {
    items.push(element.title);
  }
  return items;
}
  

Кроме того, я предлагаю вам обратить внимание на API и следить за вкладкой сети при загрузке этого ресурса, например, извлечение данных из URL http://block.hacash.org/api/block/list?last=170246amp;limit=1000 будет намного проще и быстрее и может решить ту же задачу быстрее.

Комментарии:

1. Что касается API, если я установлю ограничение на limit=1000 , оно вернется all json data в браузере Android Google Chrome, однако, когда я также использую его для вызова API в Windows Google Chrome if limit >=100 , он вообще не вернет никаких данных. Была ли это проблема браузеров?

2. Вы получаете какие-либо ошибки при открытии этого URL-адреса в браузере Chrome? Вы пытались отправить запрос get с помощью js / node или любого другого языка? Кроме того, я предложу исследовать эту конечную точку и, возможно, найти другие параметры или ограничения.

3. если я установлю limit = 100, он вернет мне всю необходимую информацию {"datas":[{"hash":"0000000004f035591843c550fa5432ea6dae8ec701fb80cb4e90e28c265c512c","txs":1,"time":1599535774,"height":169355,"nonce":368313987,"bits":3706342511,"rewards":{"amount":"ㄜ1:248","address":"1DYY4ZRsWnhjcwwnE3dWgtiqe2mctDS2HF","message":"HacPool"},"bitstr":3706342511}, . Однако, если я установлю предельный проход 100, например 101, он просто вернется {"datas":169255,"ret":0}

4. Вы пробовали другие конечные точки, такие как http://block.hacash.org/api/transfer/logs?page=1amp;limit=1000 ? Если это также не работает, просто создайте цикл, который отправит запрос на получение 100 записей, что-то вроде const LIMIT = 100; do { const lastEntry = await getLastEntry(); const response = await fetch( http://block.hacash.org/api/block/list?last=${lastEntry}amp;limit=${LIMIT} ); const result = await response.json(); await processResults(результат); } while (результат. длина === ПРЕДЕЛ);