Как парсить динамические страницы PHP

Задание: Спарсить динамически подгружаемый блок на YouTube (блок лицензии под описанием с id #collapsible). Начальный DOM страницы состоит из закодированных скриптов, поэтому PHP не видит желаемого элемента. Лишь после полной отработки JS загружаются все остальные данные. введите сюда описание изображения

Уточнение: YouTube API и oEmbed НЕ подходят для этих нужд

Подскажите как решить это посредством PHP (решит ли вопрос phpQuery) или другие способы решения.

Опыт: Подключил библиотеку «Simple Html Dom Php», однако она работает только со статическими страницами.

Код: Мое решение на котором остановился

<?php
    require 'simple_html_dom.php'; //подключаем библиотеку
    $link = 'https://www.youtube.com/watch?v=kdmBTTAFlk0';
    $html = file_get_html( $link ); // получаем страницу

    $load = file_get_contents( $link );
    $html= str_get_html( $load );

    echo $element = $html->find('#collapsible', 0);
?>


Ответы (1 шт):

Автор решения: Ein

как решить это посредством PHP

Достаточно сложно, т.к. PHP не слишком предназначен для этого. Один из вариантов - V8js модуль.

другие способы решения

Взять Node.js и Puppeteer:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.youtube.com/watch?v=Hc16Y9fiCvQ');

    await page.waitForSelector('paper-button#more');

    await page.click('paper-button#more');

    await page.waitForSelector('#collapsible ytd-metadata-row-header-renderer');

    let desc = await page.evaluate(() => {
        let innerText = [];
        document.querySelectorAll('ytd-metadata-row-renderer.ytd-metadata-row-container-renderer')
            .forEach(node => innerText.push(node.innerText));

        return Promise.resolve(innerText);
    })


    console.log(desc);

    await browser.close();
})();

Есть и для Python, но лично не пробовал.

→ Ссылка