Потребовалось выкачать один сайт, полмиллиона страниц. Дописал модуль к своему старенькому сайтмеп-генератору, чтобы сливал страницы в БД. Но наткнулся на засаду:
Браузером страницы открываются; попробовал курлом: если юзерагент пустой, то 403-я; если юзерагент нормальный, 200-й статус.
Не удалось нагуглить, можно ли по курлу вытянуть текст страницы. Оно вообще возможно?
Очень не хочется строить на сокетах, я с ними никогда не
работал и проваландаюсь фиг знает сколько времени...
Спустя 17 минут, 37 секунд (3.09.2009 - 12:10) FatCat написал(а):
Сорри, ступил, там оказалось не просто, а очень просто:
http://www.samborsky.com/php/605/А я на автопилоте оставил имевшуюся в сайтмеп-генераторе:
PHP |
curl_setopt($ch, CURLOPT_NOBODY, 1); |
Спустя 11 минут, 45 секунд (3.09.2009 - 12:22) glock18 написал(а):
Я уже советовать собрался

Быстро ты
Спустя 26 минут, 32 секунды (3.09.2009 - 12:48) FatCat написал(а):
Увы, там какая-то другая защита.
Не понимаю...
Открываю в браузере - всё ОК.
Тяну страницу скриптом:
PHP |
$in='http://site.ru/index.php'; $ch = curl_init(); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_URL, $in); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_REFERER, $in); curl_setopt($ch, CURLINFO_HEADER_OUT, true); curl_setopt($ch, CURLOPT_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-й эррор.
Спустя 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 написал(а):
Респект!!!
Как удалось это выяснить?
Спустя 24 минуты, 32 секунды (3.09.2009 - 21:29) kirik написал(а):
Цитата (FatCat @ 3.09.2009 - 13:04) |
Как удалось это выяснить? |
Зашел через другой браузер (Konqueror), в нем сайт показал 403 страницу; сравнил заголовки отдаваемые браузерами, и методом научного тыка дошел до этого
Спустя 19 минут, 14 секунд (3.09.2009 - 21:48) FatCat написал(а):
Еще раз спасибо!
Качаю.
Я так понимаю, что
PHP |
copy($avatar_url, $_SERVER['DOCUMENT_ROOT']."/uploads/av-".$member_id.".".$avatar_ext); |
тоже не будет
работать...
Спустя 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); |
А вот и функция

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($source, 0, $context);
if (empty($dest)) { return $result; } else { return file_put_contents($dest, $result); } } |
если второй параметр указан, то результат скопируется
Спустя 45 минут, 13 секунд (3.09.2009 - 23:34) FatCat написал(а):
Спасибо, сегодня поленюсь с картинками морочиться, может завтра.

UPD:
Не утерпел, залез, сделал. Еще раз спасибо,
работает.
_____________
Бесплатному сыру в дырки не заглядывают...