Здравствуйте, Funny Rabbit, Вы писали:
FR>Делаю парсер сайта. надо собирать с него информацию (картинки, текст). Использую PHP Simple HTML DOM. Вопрос в следующем. Почему не выводиться 2?
1. Что показывает такой код?
$data=@file_get_contents("https://casa.com.tr/lipari-585");
if (preg_match("|\S+\s+(\d+)|",$http_response_header[0],$m)) $error_code=intval($m[1],10); else $error_code=false;
$datalen=strlen($data);
echo "result=$error_code datalen=$datalen\n";
У меня например просто пишет 404 и нет данных
2. делайте очередь закачки отдельно от парсера. парсер должен только ставить задачи на закачку. Если не качается то проблемы авторизации и повторных отложенных попыток закачек не задача парсера. Так же как и распаралеливание запросов
| можно curl-ом сделать |
| примерно так:
$urls=[ 'url1','url2','url3' ];
$chs=[];
foreach($urls as $url) {
$ch=$curl_init(); $chs[]=$ch;
curl_setopt($ch, CURLOPT_URL, 'url1');
curl_setopt($ch, CURLOPT_HEADER, 0);
}
$mh = curl_multi_init();
foreach($chs as $ch) curl_multi_add_handle($mh,$ch);
$active = null;
do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) == -1) usleep(1000);
do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
foreach($chs as $ch) curl_multi_remove_handle($mh,$ch);
curl_multi_close($mh);
|
| |
Плюс можно мониторить что идёт в очереди. Мокать, хукать и патчить и отлаживать отдельные участки без необходимости перекачивать 100500 файлов.
3. кэшируйте данные (будут быстрее и можно поотлаживаться на трупах) и выяснить что происходило.
4. проверяйте и логируйте ошибки.