[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Народ помогите разобраться с парсером
Bodich
Есть скрипт парсера :

ini_set('max_execution_time', 600);
//замеряем время начала работы скрипта
$st_time = microtime(true);

//устанавливаем переменные...
$url = $_POST['url'];
$types = $_POST['types'];
$maxPages = (int)$_POST['max'];
$host = explode('/', substr($url, 7));
$host = substr($url, 0, 7).$host[0].'/';
//про последние 2 строчки подробней: таким вот образом получаем Адрес сайта (на случай, если ввели
//адрес странички сайта) - разбиваем на массив по слешу и берём первую часть...

//для удобства работы с КУРЛом, напишем простенькую функцию
//параметры: $host - адрес, $referer - откуда пришли (можно подделать, в статистике парсимого сайта будет отображаться, что мы пришли, например, с Яндекса :))
//$file - идентификатор файла (если мы хотим скачать файл, то передаём его идентификатор)

function curl_get($host, $referer = null, $file = null){
//инициализация curl и задание основных параметров
$ch = curl_init($host);
curl_setopt($ch, CURLOPT_USERAGENT, 'KOZ1024 Site Parser');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_REFERER, $referer);
//если дали ссылку на файл
if (!is_null($file)){
//то устанавливаем опцию записи в файл,
curl_setopt($ch, CURLOPT_FILE, $file);
//и выполняем
curl_exec($ch);
//не забываем закрыть соединение
curl_close($ch);
}else{
//если же ссылку на файл не дали, то возвращаем страничку
ob_start();
curl_exec($ch);
print(curl_error($ch));
curl_close($ch);
return ob_get_clean();
}
}

//получаем html-код исходной страницы
$page = curl_get($url);
//регулярным выражением ищем вхождение ссылок
preg_match_all('#href="([A-z0-9.-]+)"#', $page, $matches);
//получаем массив всех-всех ссылок с этой старницы
$links = $matches[1];
$cnt = 0;
//цикл: пока не прошли весь массив ссылок, либо пока не скачали макс. количество файлов (не действет в случае 0)
for($i=0; ($i<sizeof($links)&&($cnt<$maxPages||$maxPages==0)); $i++){
//если в ссылке есть нужное нам расширение
if (strpos($links[$i], $types)!==false){
//то открываем файл, "курлим" в него содержимое файла на сервере, закрываем, увеличиваем счётчик
$fp = fopen($links[$i], 'w');
curl_get($host.$links[$i], $url, $fp);
fclose($fp);
$cnt++;
}else{
//иначе это ещё одна ссылка, перейдём по ней, найдём все ссылки и занесём их в массив
$page = curl_get($links[$i], $url);
preg_match_all('#href="([A-z0-9.-]+)"#', $page, $matches);
$links = array_merge($links, $matches[1]);
}
}

//замеряем время окончания работы и выводим...
$en_time = microtime(true);
print 'Скачано файлов: '.$cnt.'<br />Время выполнения: '.($en_time-$st_time);



в частности вот этот кусок
//то открываем файл, "курлим" в него содержимое файла на сервере, закрываем, увеличиваем счётчик
$fp = fopen($links[$i], 'w');
curl_get($host.$links[$i], $url, $fp);
fclose($fp);
$cnt++;


вообщем ошибок он не выдает но мне не совсем понятно где результаты его работы хранятся :huh:



Спустя 1 час, 51 минута, 39 секунд (22.04.2012 - 18:41) walerus написал(а):
Сделай вывод
print_r( $links [$i] );
и тебе сразу все станет ясно...

Спустя 51 минута, 21 секунда (22.04.2012 - 19:32) Bodich написал(а):
какой бы адрес не вводил
preg_match_all('#href="([A-z0-9.-]+)"#', $page, $matches);
print_r( $matches );
дает
Array ( [0] => Array ( ) [1] => Array ( ) ) sad.gif

Спустя 6 минут, 48 секунд (22.04.2012 - 19:39) Игорь_Vasinsky написал(а):
паттерн не верный.

универсального паттерна для всех сайтов ещё не придумали))) обещают тока в php5.4

Спустя 2 минуты, 33 секунды (22.04.2012 - 19:41) Bodich написал(а):
http://koz1024.net/curl-site-parser/
а пишет - проверен в боевых условиях mad.gif

ну хорошо может подскажешь как научится парсить на курле , может ссылку на ресурс хороший ..

Спустя 2 минуты, 22 секунды (22.04.2012 - 19:44) Игорь_Vasinsky написал(а):
парсеры сайтов - хрупкая дорожка))0 сменили вёрстку - полетела вся конструкция

если платил - связывайся с разрабом. было у меня пару случаев - корректировал. клиент всегда прав!!

Спустя 1 минута, 29 секунд (22.04.2012 - 19:45) Игорь_Vasinsky написал(а):
Цитата
ну хорошо может подскажешь как научится парсить на курле , может ссылку на ресурс хороший ..


у меня в подписи надпись biggrin.gif парсеры - мой хлеб. так что извеняй.

поиск на форуме "CURL" - есть топик от winston

Спустя 1 минута, 10 секунд (22.04.2012 - 19:46) Игорь_Vasinsky написал(а):
может

preg_match_all('#href="(.*)iusU"#', $page, $matches);

Спустя 3 минуты, 54 секунды (22.04.2012 - 19:50) Bodich написал(а):
Цитата (Игорь_Vasinsky @ 22.04.2012 - 17:45)
у меня в подписи надпись  парсеры - мой хлеб. так что извеняй.


я тебе не конкурент по опыту не дошел.

Цитата (Игорь_Vasinsky @ 22.04.2012 - 17:45)
поиск на форуме "CURL" - есть топик от winston

это там где он пишет как ПОСТ отсылать, про парс там мало (

Спустя 3 минуты, 36 секунд (22.04.2012 - 19:54) Игорь_Vasinsky написал(а):
проблема в паттерне - подтягивай регулярные выражения

Спустя 2 часа, 43 минуты, 7 секунд (22.04.2012 - 22:37) Bodich написал(а):
вот рабочий нашел
preg_match_all('#<a\s+href\s*=\s*["\']?([^\s>]+?)["\']?[.]*?>(.*?)</a>#i',$page, $matches);


Игорь_Vasinsky, скажи в чем преимущества курл парсера, скажем от phpQuery парсера ??

Спустя 7 часов, 8 минут, 38 секунд (23.04.2012 - 05:46) Игорь_Vasinsky написал(а):
phpQuery, Simple HTML DOM - это всё библиотеки, способные сократить код при парсинге, но как правило жрут память. Иногда выгодней работать регулярками.

Это инструменты для разбора DOM полученных страниц по полочкам.

А курл -это всего библиотека для имитации юзера и получения удалнного контента.

так что как видишь их сравнивать нельзя.

иногда вместо курла вообще достаточно file_get_contents()

Спустя 14 часов, 16 минут, 4 секунды (23.04.2012 - 20:02) Bodich написал(а):
 $ch = curl_init('http://povarec.net');
//Установка опций
curl_setopt($ch, CURLOPT_USERAGENT, 'KOZ1024 Site Parser');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_REFERER, 'http://example.com');
//выполнение (результат отобразится на экран)
curl_exec($ch);
//Закрытие соединения
curl_close($ch);


вопрос : как имитировать что пришел гуглбот ?

Спустя 36 минут, 59 секунд (23.04.2012 - 20:39) alexbel2404 написал(а):
curl_setopt($ch, CURLOPT_REFERER, 'http://google.com/');
curl_setopt($ch, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)');

я так делаю) а потом последний посещенный урл, если он внутренний, подставляю в реферер

Спустя 3 часа, 4 минуты, 25 секунд (23.04.2012 - 23:43) Bodich написал(а):
спасиб !!! )

Спустя 12 часов, 3 минуты, 54 секунды (24.04.2012 - 11:47) Bodich написал(а):
еще такой вопрос : допустим если человек парсит новостной сайт, который обновляется каждый день скажем в 11.00. Как гуглбот узнает где впервые появилась статья на оригинале или на клоне ..??
и еще зачем парсят новостную ленту , та ведь не вся новость, а только превьюшка ..??

Спустя 1 час, 55 минут, 53 секунды (24.04.2012 - 13:43) Bodich написал(а):
хм видимо я задал запрещенный вопрос , ибо нехорошо грабить чужой контент huh.gif

Спустя 10 часов, 8 минут, 27 секунд (24.04.2012 - 23:51) walerus написал(а):
Bodich - На счет Гугла, лучше у него спросить ), как он шарит кто первый, если бы кто то знал(мб кто то и знает...) как он определяет, то не было бы, "рерайтеров" и всей остальной лабуды, а все тупо становились бы копирайтерами, указывая гуглу, стуча в грудь пяткой, что автор статьи - это ты ! ), а не тот новостной сайт. Причем, я думаю что новостной сайт, индексируется за минуты, а то и быстрее, чем твой сайт, с паршеным контентом, если конечно ты не в топ 3 гугла biggrin.gif .

Как вариант, тебе ставить ссылку под статьей на источник, что бы гугл тебя сразу не выплюнул на N-ю страницу.

Цитата
и еще зачем парсят новостную ленту , та ведь не вся новость, а только превьюшка ..??
Ты все правильно подметил - только превьюшка(но не всегда, есть и полностью статьи распологают), но кто мешает перейти по адресу статьи? и ее распарсить.
Быстрый ответ:

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