Проблемы с PHP Simple HTML DOM
От: Funny Rabbit Россия  
Дата: 19.07.19 09:08
Оценка:
Делаю парсер сайта. надо собирать с него информацию (картинки, текст). Использую PHP Simple HTML DOM. Вопрос в следующем. Почему не выводиться 2?

include('../simplehtmldom/simple_html_dom.php');

$html = file_get_html('https://casa.com.tr/en/products');
$arr = array();
$data = array();
foreach($html->find('a') as $element)
{
    $page = new simple_html_dom();
    $page->load('https://casa.com.tr/lipari-585');
    if($page)
    {
        $title = $page->find("body");
        echo $title->innertext;
        
        foreach($page->find('div[id=breadcrumb]') as $p)        
        {                
            echo 2;
        }
            
    }
    sleep(3);
    $page->clear();
    unset($page);
}
$html->clear(); // подчищаем за собой
unset($html);
То что меня не убивает, делает меня умнее.
Re: Проблемы с PHP Simple HTML DOM
От: kov_serg Россия  
Дата: 19.07.19 10:13
Оценка: 4 (1)
Здравствуйте, 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. проверяйте и логируйте ошибки.
Re[2]: Проблемы с PHP Simple HTML DOM
От: Funny Rabbit Россия  
Дата: 22.07.19 08:44
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, 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 и нет данных

У меня тоже пишет 404. Заголовки добавляю.

<?php    

require_once('ganon.php');

function grab_image($url,$saveto)
{
    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
    $raw=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($saveto)){
        unlink($saveto);
    }
    $fp = fopen($saveto,'x');
    fwrite($fp, $raw);
    fclose($fp);
}

$html = file_get_dom('https://casa.com.tr/en/products');
foreach($html('a') as $element) 
{
    //echo $element->href, "<br>\n"; 

    $options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
  )
);

    $cntxt = stream_context_create($options);
    $page = file_get_dom('https://casa.com.tr/lipari-585', $context = $cntxt);    
    
    if($page)
    { 
        echo 1;
        /*
        foreach($page->find('div[id=breadcrumb]') as $p)        
        {                
            echo 2;
        }
        */
    
    }
    sleep(3);
}
То что меня не убивает, делает меня умнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.