помогите пожалуйста исправить ошибку при парсинге страниц 404

Тема в разделе "Как сделать...", создана пользователем maxy666, 3 сен 2013.

  1. maxy666

    maxy666 Постоялец

    Регистр.:
    23 июл 2012
    Сообщения:
    124
    Симпатии:
    31
    Написал простенький скрипт для парсинга товаров с алиекспреса, использовал библиотеку PhpQuery. Парсер умеет собирать сразу несколько товаров одним проходом. В общем общий вид парсера:
    [​IMG]

    Верхнее поле предназначено для ввода url товаров, нижнее для ввода вручную название.
    Бывают случаи когда накопируешь кучу товаров, запустишь парсинг, а один из них сразу же удалят, например
    http://ru.aliexpress.com/item/2013-...es-couple-shoes-Free-shipping/1202258836.html
    [​IMG]
    В таком случаи скрипт дойдя до такого url товара полностью останавливаться.
    Пробовал написать проверку, на title = "Page Not Found - Aliexpress.com"
    PHP:
    // Получает тайтл товара
    $title $html->find('title');
    if 
    "Page Not Found - Aliexpress.com"
    {
    echo 
    "товар $url[$i] удален";
    }
    else {
    тело выполнение скрипта
    }
    Но получить тайтл со страницы 404 не получилось. Пожалуйста посоветуйте как можно получить тайтл или другие данные что бы идентифицировать такие страницы 404.
     
  2. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    608
    Симпатии:
    479
    Приведите конкретный код проверки тайтла.

    Судя по
    Вы, случаем, не так проверяете?
    PHP:
    if ($title="Page Not Found - Aliexpress.com")
    Распространённая ошибка использовать "=" вместо "==" в условиях.
     
    maxy666 нравится это.
  3. maxy666

    maxy666 Постоялец

    Регистр.:
    23 июл 2012
    Сообщения:
    124
    Симпатии:
    31
    cпасибо, подправил '==' в условии
    Посмотрите пожалуйста, это начало скрипта. В начали перебираю доступность товара и пробую получить тайтл.
    PHP:
    if ( isset( $_POST['submit'] ) )
    {
        
    $url_links = ($_POST["url_links"]); // Заносим в переменную $url_links содержание textarea
        
    $url_links preg_split('/[\r\n]+/'$url_links, -1PREG_SPLIT_NO_EMPTY);  // Обрабатываем содержание teatarea, получаем каждую строку в отдельный елемент масива
        // Обрабатываем textarea с названиями товаров
        
    $title_list_product = ($_POST["title_list_product"]); // Заносим в переменную $title_list_products содержание textarea с названиями товаров
        
    $title_list_product preg_split('/[\r\n]+/'$title_list_product, -1PREG_SPLIT_NO_EMPTY);  // Обрабатываем содержание teatarea, получаем каждую строку в отдельный елемент масива
        // Цикл парсинга url по отдельности
        
    foreach ( $url_links as $key => $from )
        { 
            
    // загружаем страницу с товарами
            
    $product_html_link file_get_contents($from);
            
    $document phpQuery::newDocument($product_html_link);
           
            
    //  Выполняем проверку на "товар_больше недоступен"
                
    $product_Not_Available $document->find('div#no-longer-available');
                if (!empty(
    $product_Not_Available))
                    {
                        echo 
    "$from данный - товар недоступен для заказ";
                    }
            
    // Выполняем проверку удален ли товар       
                
    $product_title $document->find('title');
                if (
    $title == "Page Not Found - Aliexpress.com")
                    {
                        echo 
    "товар удален и не подлежит парсингу";
                    }
                   
            
    /////////// Поиск картинок, цены, описание товара
                   
           
        
    }
       
       
    }
     
  4. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    608
    Симпатии:
    479
    Навскидку - вроде рабочий код. Так что - помогло исправление знака равенства в условии?
     
    maxy666 нравится это.
  5. maxy666

    maxy666 Постоялец

    Регистр.:
    23 июл 2012
    Сообщения:
    124
    Симпатии:
    31
    попробовал отдельно от своего скрипта спарсить одну одну страницу с "Page Not Found - Aliexpress.com" но заголовок с помощью поиска title библиотекой PhpQuery
    не получен
    PHP:
    $product_title $document->find('title'); 
    echo 
    "$product_title";
    Так же пробовал сделать загрузку и просто вывод страницы "Page Not Found - Aliexpress.com 404 ", но выдает пустой результат (переменная $product_html_link и $document)

    PHP:
    $url "http://ru.aliexpress.com/item/2013-casual-shoes-sneakers-Fashion-running-shoes-couple-shoes-Free-shipping/1202258836.html";
    $product_html_link file_get_contents($url);
    echo 
    "$product_html_link"
    $document phpQuery::newDocument($product_html_link);
    echo 
    "$document";
    возможно получить тайт и другие данные со страниц 404 не возможности? или с такие страницы надо как то по другому парсить?
     
  6. mpv

    mpv Постоялец

    Регистр.:
    30 апр 2013
    Сообщения:
    67
    Симпатии:
    13
    при коннекте проверяй код http, а уже потом парси содержимое

    Код:
    $answer = check_http_status($url);
        if ($answer < 400) {
        echo "ok";
        }
     
    Последнее редактирование: 3 сен 2013
    CAPAXA нравится это.
  7. BDSG

    BDSG

    Регистр.:
    28 фев 2009
    Сообщения:
    203
    Симпатии:
    109
    в вашем случае так:
    PHP:
            // загружаем страницу с товарами
            
    $product_html_link = @file_get_contents($from);
        
            if( 
    $product_html_link ){ /** получили */ }
            else{ 
    /** не получили */ }
    хотя, имхо, странно такие задачи решать через файловую обёртку.. посмотрите лучше в сторону curl или сокетов - там не в пример больше возможностей работать с сетевым стримом..
     
  8. maxy666

    maxy666 Постоялец

    Регистр.:
    23 июл 2012
    Сообщения:
    124
    Симпатии:
    31
    Спасибо все за советы, использовал get_headers
    в случаи ошибки 404 получаю HTTP/1.1 404 Not Found
    PHP:
    $headers get_headers($url);
    $code $headers[0];
    if (
    $code HTTP/1.1 404 Not Found )
    {echo 
    "товар -  $url не доступен}
     
  9. mpv

    mpv Постоялец

    Регистр.:
    30 апр 2013
    Сообщения:
    67
    Симпатии:
    13
    лучше проверяй что бы http код был меньше 400, будет более универсальное решение
     
  10. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243
    Надеюсь, в реальном коде там два значка равенства?..
    (и кавычки, видимо, присутствуют - иначе код не выполнился бы.. А вот "==" можно и пропустить.)
    Код:
    if ($code = HTTP/1.1 404 Not Found )
    А вообще, код HTTP-статуса можно получить стандартной функцией CURL
    Код:
    curl_getinfo($ch,CURLINFO_HTTP_CODE);