Я делаю упражнение по кодированию с помощью nodejs и кукольника. Я хочу сделать простой скрипт парсинга Instagram. Я пробовал использовать модуль axios и HTTP, но с этим решением мне не удалось получить все содержимое из-за курсоров, используемых для разбивки на страницы. Затем я переключился на кукловода и пытаюсь использовать этот код
#!/usr/bin/env node
const puppeteer = require('puppeteer');
let imagesLinks = [];
function extractItems() {
const extractedElements = document.querySelectorAll('img');
const items = [];
for (let element of extractedElements) {
items.push(element.src);
}
console.info(items);
return items;
}
async function scrapeInfiniteScrollItems(page, extractItems, itemTargetCount, scrollDelay = 1000){
let items = [];
try {
let previousHeight;
while (items.length < itemTargetCount) {
items = await page.evaluate(extractItems);
previousHeight = await page.evaluate('document.body.scrollHeight');
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
await page.waitForFunction(`document.body.scrollHeight > ${previousHeight}`);
await page.waitFor(scrollDelay);
}
} catch(e) { }
return items;
}
(async() => {
const browser = await puppeteer.launch({
headless: false,
//args: ['--incognito']
});
const page = await browser.newPage();
page.setViewport({height: 680, width: 1280});
await page.goto('https://instagram.com/username');
page.waitForSelector('.aOOlW.bIiDR').then( el => el.click() );
// Scroll and extract items from the page.
const items = await scrapeInfiniteScrollItems(page, extractItems, 100);
console.info(items);
})();
Когда я запускаю скрипт, кукольник откроет две вкладки хрома, одна пустая, а вторая откроет ссылку, переданную функции page.goto
. Можно ли настроить кукловод так, чтобы он открывал только вкладку, на которой будет отображаться нужный URL? Еще одна проблема, с которой я столкнулся, - это бесконечная прокрутка Instagram. Я могу щелкнуть всплывающее окно cookie, которое отображается после загрузки страницы, затем сценарий начнет захватывать ссылки на изображения, но после некоторых прокруток он перестанет прокручиваться, потому что появится всплывающее окно входа в систему, и body
получит overflow: hidden
имущество. Как я могу предотвратить остановку прокрутки скрипта до тех пор, пока страница не достигнет конца? Можно ли удалить свойство CSS и после этого позволить скрипту продолжить прокрутку для очистки содержимого?
@ggorlen Я попробую ваше предложение по первому вопросу. Что касается второго вопроса, проблема не во всплывающем окне, а в самом скрипте. Я думаю, что в коде есть ошибка, которая вызовет проблему. Я могу сказать это, потому что, если у профиля есть 300 общих изображений, скрипт продолжит прокрутку также с открытым всплывающим окном и произвольно остановит прокрутку. Всплывающее окно можно закрыть, скрыв его с помощью css и удалив overflow: hidden
, и api продолжит обслуживание содержимого.
Первый вопрос:
const [page] = await browser.pages();
должен работать. Второй вопрос. Я почти уверен, что instragram не позволяет просто скрыть модальное окно и вернуться к бесконечной прокрутке. API, скорее всего, полностью прекратит доставку данных фида, чтобы заставить вас войти в систему, что вы могли бы сделать.