#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 на стороне клиента.