Как ускорить или задержать file_get_contents PHP для очистки полностью загруженной страницы?

#php #html #web-scraping

#php #HTML #очистка веб-страниц

Вопрос:

Я использую file_get_contents регулярные выражения для очистки данных с веб-сайта.

Я использую функцию внутри цикла «for», чтобы очистить все страницы от 1 до 2000.

Веб-сайт, который я пытаюсь очистить, закодирован в React , я думаю, потому что я вижу подобные вещи в его html: data-reactid="408"

Мой код хорошо работает для очистки данных только с первой страницы, но когда он переходит на вторую страницу и более поздние страницы, он возвращает разные html-теги к тому, что я ожидаю, и, таким образом, мои регулярные выражения возвращают 0 найденных элементов. После небольшого исследования я обнаружил, что это file_get_contents очень быстро, до такой степени, что возвращает версию страницы, не полностью загруженную, я думаю, React вносит некоторые постмодернизации в ссылки HTML href и преобразует теги span в теги a.

Теперь я ищу способ сообщить file_get_contents , что нужно подождать, пока страница не перейдет в состояние окончательной загрузки, а затем вернуть мне HTML.

У вас есть идея сделать это?

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

1. Вы не можете сделать это так, любой метод получения HTML без интерпретации javascript может пропустить то, что выполняется при загрузке страницы (или позже). Я бы также рекомендовал не использовать regex и посмотреть что-то вроде DOM Document для чтения страниц,

Ответ №1:

PHP (и file_get_contents ) извлекает только html-код, он не будет выполнять какой-либо клиентский JavaScript и из-за этого не будет отражать никаких динамических изменений на веб-сайте.

Для этого вам придется использовать что-то вроде puppeteer или CasperJS. Они могут выполнять рендеринг на стороне клиента на вашей стороне и возвращать вам окончательный HTML-код.

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

1. спасибо за ваши предложения, я попробую прочитать о puppeteer и CasperJS.

Ответ №2:

Значение по умолчанию для тайм-аута в file_get_contents() составляет 60 секунд, что кажется довольно долгим, и вы не указали, как долго обрабатывалась страница.

Если прошло более 60 секунд, вы можете использовать :

 ini_set('default_socket_timeout', 90);
  

чтобы запросить больше, например, 90 секунд.

Если страницы загружаются быстрее 60 секунд, то я предполагаю, что проблема в вашей логике кода, например, вы ожидаете, что будет запущен какой-то Javascript на стороне клиента.