#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 Chromeif 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 (результат. длина === ПРЕДЕЛ);