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

maxy666

Профессор
Регистрация
23 Июл 2012
Сообщения
143
Реакции
44
Написал простенький скрипт для парсинга товаров с алиекспреса, использовал библиотеку PhpQuery. Парсер умеет собирать сразу несколько товаров одним проходом. В общем общий вид парсера:
613ff66bdf8e.jpg
Верхнее поле предназначено для ввода url товаров, нижнее для ввода вручную название.
Бывают случаи когда накопируешь кучу товаров, запустишь парсинг, а один из них сразу же удалят, например
Для просмотра ссылки Войди или Зарегистрируйся
004c729af618.jpg

В таком случаи скрипт дойдя до такого url товара полностью останавливаться.
Пробовал написать проверку, на title = "Page Not Found - Aliexpress.com"
PHP:
// Получает тайтл товара
$title = $html->find('title');
if "Page Not Found - Aliexpress.com"
{
echo "товар $url[$i] удален";
}
else {
тело выполнение скрипта
}

Но получить тайтл со страницы 404 не получилось. Пожалуйста посоветуйте как можно получить тайтл или другие данные что бы идентифицировать такие страницы 404.
 
PHP:
// Получает тайтл товара
$title = $html->find('title');
if "Page Not Found - Aliexpress.com"
{
echo "товар $url[$i] удален";
}
else {
тело выполнение скрипта
}

Приведите конкретный код проверки тайтла.

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

Распространённая ошибка использовать "=" вместо "==" в условиях.
 
cпасибо, подправил '==' в условии
Посмотрите пожалуйста, это начало скрипта. В начали перебираю доступность товара и пробую получить тайтл.
PHP:
if ( isset( $_POST['submit'] ) )
{
    $url_links = ($_POST["url_links"]); // Заносим в переменную $url_links содержание textarea
    $url_links = preg_split('/[\r\n]+/', $url_links, -1, PREG_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, -1, PREG_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 "товар удален и не подлежит парсингу";
                }
               
        /////////// Поиск картинок, цены, описание товара
               
       
    }
   
   
}
 
cпасибо, подправил '==' в условии
Посмотрите пожалуйста, это начало скрипта. В начали перебираю доступность товара и пробую получить тайтл.
Навскидку - вроде рабочий код. Так что - помогло исправление знака равенства в условии?
 
попробовал отдельно от своего скрипта спарсить одну одну страницу с "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 не возможности? или с такие страницы надо как то по другому парсить?
 
Но получить тайтл со страницы 404 не получилось. Пожалуйста посоветуйте как можно получить тайтл или другие данные что бы идентифицировать такие страницы 404.

при коннекте проверяй код http, а уже потом парси содержимое

Код:
$answer = check_http_status($url);
    if ($answer < 400) {
    echo "ok";
    }
 
Последнее редактирование:
в вашем случае так:
PHP:
        // загружаем страницу с товарами
        $product_html_link = @file_get_contents($from);
    
        if( $product_html_link ){ /** получили */ }
        else{ /** не получили */ }
хотя, имхо, странно такие задачи решать через файловую обёртку.. посмотрите лучше в сторону curl или сокетов - там не в пример больше возможностей работать с сетевым стримом..
 
Спасибо все за советы, использовал 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 не доступен}
 
лучше проверяй что бы http код был меньше 400, будет более универсальное решение
 
PHP:
$headers = get_headers($url);
$code = $headers[0];
if ($code = HTTP/1.1 404 Not Found )
{echo "товар -  $url не доступен}

Надеюсь, в реальном коде там два значка равенства?..
(и кавычки, видимо, присутствуют - иначе код не выполнился бы.. А вот "==" можно и пропустить.)
Код:
if ($code = HTTP/1.1 404 Not Found )

А вообще, код HTTP-статуса можно получить стандартной функцией CURL
Код:
curl_getinfo($ch,CURLINFO_HTTP_CODE);
 
Назад
Сверху