Разрабатываю парсер интернет-магазина на PHP. Задача: необходимо получить html-код каталога товаров, не дожидаясь полной загрузки сайта.
Для этой цели использую
PHP Webdriver с браузером Chrome (
ChromeDriver 81.0.4044.69). Чтобы магазин меня не забанил, использую прокси, что несколько замедляет загрузку сайта. Проблема заключается в том, что html-код каталога появляется в первые секунды загрузки, но команды после
$driver->get('....')
не будут выполняться, пока магазин не загрузится полностью со всеми скриптами, стилями, картинками и т.д. С целью увеличения производительности парсера хотелось бы,чтобы как только появился html-код каталога, прерывать загрузку и переходить к дальнейшему анализу полученного html.
host = 'http://localhost:4444';
$options = new ChromeOptions();
$options->addArguments([
'--window-size=1500,800',
'-proxy-server=socks4://IPпрокси:ПортПрокси',
]);
$desiredCapabilities = DesiredCapabilities::chrome();
$desiredCapabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$driver = RemoteWebDriver::create($host, $desiredCapabilities);
$content = $driver->get('https://www.какой-то-интернет-магазин.ru/')->getPageSource();
// ждёт полной загрузки страницы и только потом выполняется дальше
$catalog = ... анализ html: вытаскиваю из $content интересующий меня фрагмент каталога;
file_put_contents('Catalog.html', $catalog);
Лучшее решение этой проблемы без костылей - это использование
Page loading strategy в режиме eager или none. Знаю, что это возможно с версии ChromeDriver 77.0. Нашёл
решение для других языков программирования, однако мне не хватает опыта, чтобы реализовать тоже самое на PHP Webdriver. Также
здесь рассказывается о:
1) костыльном методе через таймаут ожидания загрузки, но не факт, что нужный мне элемент успеет загрузиться за явно выставленное время;
2) нужной мне стратегии ожидания загрузки, но опять-таки не понятно, как это реализовать на PHP Webdriver.