Задать вопрос

Как спарсить быстро много страниц в PHP?

Есть один сайт, на котором есть много страниц, с которых мне надо взять 1 лишь блок с информацией. Таких страниц примерно под 10 000. Анкеты они идут упорядоченно, не в разброс.

Мой алгоритм таков: обращаемся через CURL к каждой странице в цикле, дальше через библиотеку phpQuery ищем класс, в котором находится нужная инфа нам, и выводим всё это на страницу. Вот код, как это сейчас выглядит:

<?php
require_once 'phpquery/phpQuery/phpQuery.php';
ini_set('max_execution_time', 0);
for($i = 1; $i <= 600; $i++) { // обработаем 600 анкет
$url = 'https://тут_адрес_сайта/anketa/' . $i; // выходит что будет обрабатываться каждая анкета начиная с 1 до 600
$val = curlIt($url);
$html = phpQuery::newDocument($val);
$pq = pq($html);
$elem = $pq->find('.distance'); // получаем содержимое внутри класса distance
if(!$elem) continue; // если такого блока нет пропускаем
echo $elem; // Выводим то содержимое класса .distance

}

function curlIt($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$res = curl_exec($ch);
curl_close($ch);
return $res;
}


Это всё срабатывает, но когда выводим 50 результатов, и при этом всё равно ждать приходится несколько минут. Попробовал вывести 500 результатов, по истечению 10 минут так и не дождался результата.
Как это сделать правильно, и чтобы вышло побыстрее?
  • Вопрос задан
  • 2521 просмотр
Подписаться 4 Оценить Комментировать
Ответ пользователя nirvimel К ответам на вопрос (6)
@nirvimel
Тут поможет кеширование промежуточных результатов (после phpQuery) в БД. Если нужно выдавать всегда актуальные данные, при том что исходные данные постоянно меняются, то у каждой записи в кеше должна быть отметка времени записи, и если с того момента прошло больше N секунд/дней, то делается повторный запрос к исходной странице.

Ну и выборка 500 страниц синхронно в одном потоке... если бы я увидел такой код в проекте, то подумал бы, что это сделано специально, чтобы разгрузить сервер для других задач или дать пользователю время сходить покурить.
Ответ написан
Комментировать