[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Получить тело страницы по CURL
FatCat
Потребовалось выкачать один сайт, полмиллиона страниц. Дописал модуль к своему старенькому сайтмеп-генератору, чтобы сливал страницы в БД. Но наткнулся на засаду:
Код
Warning: file_get_contents(http://site.ru/) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in Z:\home\p.nd\www\modules\mod_nd.php on line 64

Браузером страницы открываются; попробовал курлом: если юзерагент пустой, то 403-я; если юзерагент нормальный, 200-й статус.

Не удалось нагуглить, можно ли по курлу вытянуть текст страницы. Оно вообще возможно?
Очень не хочется строить на сокетах, я с ними никогда не работал и проваландаюсь фиг знает сколько времени...



Спустя 17 минут, 37 секунд (3.09.2009 - 12:10) FatCat написал(а):
Сорри, ступил, там оказалось не просто, а очень просто: http://www.samborsky.com/php/605/
А я на автопилоте оставил имевшуюся в сайтмеп-генераторе:
PHP
curl_setopt($chCURLOPT_NOBODY1);

Спустя 11 минут, 45 секунд (3.09.2009 - 12:22) glock18 написал(а):
Я уже советовать собрался smile.gif Быстро ты

Спустя 26 минут, 32 секунды (3.09.2009 - 12:48) FatCat написал(а):
Увы, там какая-то другая защита.
Не понимаю...
Открываю в браузере - всё ОК.
Тяну страницу скриптом:
PHP
$in='http://site.ru/index.php';
    
$ch curl_init();
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    
curl_setopt($chCURLOPT_URL$in);
    
curl_setopt($chCURLOPT_HEADER0);
    
curl_setopt($chCURLOPT_NOBODY0);
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    
curl_setopt($chCURLOPT_REFERER$in);
    
curl_setopt($chCURLINFO_HEADER_OUTtrue);
    
curl_setopt($chCURLOPT_USERAGENT"User-Agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    
$result=curl_exec($ch);// загрузка страницы
    
curl_close($ch);
    echo 
$result;
- 403-я страница...

Спустя 33 минуты, 2 секунды (3.09.2009 - 13:21) glock18 написал(а):
может в этом проблема ?

Цитата
User-Agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)


->

Цитата
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)


Если это первая страница парсинга, то ок должно быть, насколько я понимаю. Только юзерагент исправь.

Спустя 4 часа, 2 минуты, 55 секунд (3.09.2009 - 17:24) FatCat написал(а):
Там, похоже, не по юзерагенту. Никак не соображу, чем и как проверяется. Большинство проксей тоже получают 403-й эррор. sad.gif

Спустя 4 минуты, 17 секунд (3.09.2009 - 17:28) kirik написал(а):
FatCat
а могешь ссылку кинуть, которая не тянется? Можно в ЛС..

Спустя 2 часа, 6 минут, 10 секунд (3.09.2009 - 19:35) FatCat написал(а):
kirik
Кинул линк в личку. Спасибо!

Спустя 15 минут, 50 секунд (3.09.2009 - 19:50) kirik написал(а):
FatCat
Есть. Чего выяснил: если у тебя браузер не принимает русский язык, то сайт не показывается. Вот код рабочий:
PHP
$in = 'http://site.com/';
$headers = array(
    'Accept-Language: ru,en-us;q=0.7,en;q=0.3'
);

$ch = curl_init($in);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result curl_exec($ch);
curl_close($ch);
echo $result;

Спустя 1 час, 13 минут, 50 секунд (3.09.2009 - 21:04) FatCat написал(а):
Респект!!!
Как удалось это выяснить? unsure.gif blink.gif

Спустя 24 минуты, 32 секунды (3.09.2009 - 21:29) kirik написал(а):
Цитата (FatCat @ 3.09.2009 - 13:04)
Как удалось это выяснить?

Зашел через другой браузер (Konqueror), в нем сайт показал 403 страницу; сравнил заголовки отдаваемые браузерами, и методом научного тыка дошел до этого smile.gif

Спустя 19 минут, 14 секунд (3.09.2009 - 21:48) FatCat написал(а):
Еще раз спасибо!
Качаю.

Я так понимаю, что
PHP
copy($avatar_url, $_SERVER['DOCUMENT_ROOT']."/uploads/av-".$member_id.".".$avatar_ext);
тоже не будет работать... sad.gif

Спустя 1 час, 28 секунд (3.09.2009 - 22:48) kirik написал(а):
FatCat
незачто)

Цитата (FatCat @ 3.09.2009 - 13:48)
Я так понимаю, что .. тоже не будет работать...

Да, с copy не выйдет, но можно ведь скачать через curl и сохранить просто..

Кстати если интересно, эту задачу можно решить другим путем, через file_get_contents:
PHP
$context stream_context_create(
    array(
        
'http' => array(
            
'method' => 'GET',
            
'header' => 'Accept-Language: ru,en-us;q=0.7,en;q=0.3' PHP_EOL,
        )
    )
);

echo 
file_get_contents('http://site.ru/'0$context);


А вот и функция smile.gif
PHP
function url($source$dest=null)
{
    
$context stream_context_create(
        array(
            
'http' => array(
                
'method' => 'GET',
                
'header' => 'Accept-Language: ru,en-us;q=0.7,en;q=0.3' PHP_EOL,
            )
        )
    );

    
$result file_get_contents($source0$context);

    if (empty(
$dest)) {
        return 
$result;
    } else {
        return 
file_put_contents($dest$result);
    }
}

если второй параметр указан, то результат скопируется smile.gif

Спустя 45 минут, 13 секунд (3.09.2009 - 23:34) FatCat написал(а):
Спасибо, сегодня поленюсь с картинками морочиться, может завтра. biggrin.gif


UPD:
Не утерпел, залез, сделал. Еще раз спасибо, работает.


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.