Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скан HTML кода на ссылки, Надо получить список ссылок 
:(
    Опции темы
rcdimon
Дата 26.2.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Я хочу написать что то типа небольшой поисковой системы (в образовательных целях). Для этого мне нада сканировать страницу и вынимать из нее все ссылки, в том числе и на картинки. Я знаю что для получения кода можно использовать LWP::Simple, но не знаю как и не знаю как потом выделить из него ссылки.

Заранее спасибо.
PM MAIL ICQ   Вверх
korob2001
Дата 26.2.2005, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Код

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
my $url = "http://yandex.ru";
my $p = get( $url );
my @links;

$p =~ s/href\=\"(http:\/\/.*?)\"/push( @links, $1 )/eg;

print join("\n", @links);

Что-то типа этого. Извини, времени в обрез. Если что-то не понятно дай знать. Этот шаблон быдёргивает только ссылки начинающиеся с http, потому как от таких ссылок ../../guest/book.cgi, толку мало.

Возможно нужно будет доработать шаблон, потому как я его толком не тестировал.

Это сообщение отредактировал(а) korob2001 - 26.2.2005, 23:02


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 27.2.2005, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



А модуль LWP::Simple - стандартный или его нет в обычном дистрибутиве?
PM MAIL ICQ   Вверх
korob2001
Дата 27.2.2005, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Стандартный.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 27.2.2005, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Это очень хорошо. И еще, спасиба, тебе. Все работает. Но хотелось бы все ссылки, в том числе и на картинки так как поисковик все же должен сканировать весь сайт. А основная цель моего поисковика- картинки.
PM MAIL ICQ   Вверх
korob2001
Дата 27.2.2005, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Цитата

Это очень хорошо. И еще, спасиба, тебе. Все работает. Но хотелось бы все ссылки, в том числе и на картинки так как поисковик все же должен сканировать весь сайт. А основная цель моего поисковика- картинки.

С каким расширением картинки нужны? .jpg .gif .bmp????


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 27.2.2005, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Все. Включая png и т.д. И попутно нада бы еще собирать инфу о их размере и разрешении. А вообще идеально- скачивать, перекодировать в jpg с качеством 60 и уменьшать до 100 пикселов примерно.
PM MAIL ICQ   Вверх
Sadok
Дата 28.2.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Код
use strict;
use LWP::UserAgent;
use HTML::LinkExtor;
use URI::URL;
my ($url, $ua, $res, $base, $p, %links);
$url = "http://gol.mkafisha.ru/";
$ua = LWP::UserAgent -> new;
$ua -> proxy(http => 'http://vali:2128');
$p = HTML::LinkExtor -> new(\&callback);
$res = $ua -> request(HTTP::Request -> new(GET => $url));
$res -> is_success() ? {$p -> parse($res -> content), print $res -> status_line ."\n"} : print "Error: " . $res -> status_line ."\n";
$base = $res -> base;
defined %links ? map {print url($_, $base) -> abs,"\n"} sort (keys %links) : print "No items, sorry...";
sub callback {
my ($tag, %attr) = @_;
map {$links{$_}++} values %attr;
}


Я вот так ссылки вырезаю.
PM   Вверх
rcdimon
Дата 28.2.2005, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Спасибо, вечером проверю как будет работать у меня. Код правда мне не ясен, но пару знакомых букв я все же нашел smile
PM MAIL ICQ   Вверх
rcdimon
Дата 1.3.2005, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Код работает хорошо, спасибо.

Мне предложили 2 способа. Какой лучше? Какой работает быстрее и выбирает большее колличество ссылок? А то первый вариант собирает точно не все

<a href="asdasd.werwer.ru">

Он найдет, но если будут пробелы между = или он будет без ковычек, то все...

Второй способ как я понял работает напрямую с сервером и вынимает ссылки по средсьвом специального модуля. Насколько это удобно? Он все пихает в один массив, а мне мылы надо в один, локальные ссылки в другой, а глобальные в третий.

А как перерабатывать картинки никто не знает? Или хотя бы как получить сведения о их размере и разрешении и при желании скачать.
PM MAIL ICQ   Вверх
korob2001
Дата 1.3.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Цитата

Мне предложили 2 способа. Какой лучше? Какой работает быстрее и выбирает большее колличество ссылок? А то первый вариант собирает точно не все

<a href="asdasd.werwer.ru">

Он найдет, но если будут пробелы между = или он будет без ковычек, то все...

С каждым из них нужно работать, потому как это только заготовки. Есть конечно же ещё и другие пути, например: стандартный модуль HTML::Parser.
Цитата

Второй способ как я понял работает напрямую с сервером и вынимает ссылки по средсьвом специального модуля. Насколько это удобно? Он все пихает в один массив, а мне мылы надо в один, локальные ссылки в другой, а глобальные в третий.

Если у тебя есть один массив со всеми ссылками, то что стоит его разбросать по группам? Это гараздо проще, чем парсить HTML страничку.
Цитата

А как перерабатывать картинки никто не знает? Или хотя бы как получить сведения о их размере и разрешении и при желании скачать.

Здесь тебе помугут модули GD, Image::Magick, Image::Size. Почитай документацию по этим модулям.

Будут конкретные вопросы, пиши.

Удачи.




--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
rcdimon
Дата 1.3.2005, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Шпасиба
PM MAIL ICQ   Вверх
Usya
Дата 17.7.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Здравствуйте, я не стал создавать новой темы, так как задача похожая, но немножко потруднее... smile

Как выкачать все ссылки с сайта?
Вернее необходимо проверить все линки (локальные, глобальные) на наличии ключевой комбинации символов, но для этого их надо сначала выкачать...

Может кто-нибудь сталкивался с этим?
Думал сделать это через wget - он то позволяет выкачивать сайты целиком, но не смог найти, как выкачать только линки.
Должен же быть какой-нибудь простой способ.

Заранее благодарен.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Morgul
Дата 19.7.2005, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.7.2005

Репутация: нет
Всего: нет



Usya, наверное, надо просто собирать линки и анализировать их (если внутренние, дальше топаем).
я вот этим модулем пользуюсь для сбора ссылок: HTML::LinkExtor
PM MAIL   Вверх
Usya
Дата 19.7.2005, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Спасибо за совет

На счет модуля HTML::LinkExtor здесь уже немного упоминалось

Единственное два но:
1) Мне придется делать запрос, чтоб на серваке установили этот модуль...(хотя это решаемо)...
2) Придется лазить по каждой странице... Почему то кажется, что должен быть более простой способ. В т.ч., например, с wget. Ведь с помощью wget можно выкачивать сайты целиком. Скорее всего должна быть возможность выкачивания только линков, но я не нашел как...
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
korob2001
Дата 19.7.2005, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 13
Всего: 61



Usya - Гипер ссылка является частью html кода, потому, что бы получить ссылки со всех страниц сайта, нужно пропарсить все эти страницы. Можно конечно получить их прямо из БД, но для этого у тебя должен быть доступ к базе или файлу.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 20.7.2005, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Это понятно, но одно дело парсить вручную, вернее самому писать и отлаживать код (локальные, глобальные ссылки, всякие исключения) и совсем другое, если это можно записать в одну-две строчки...

Кстати, кажется нашел золотую жилу

1) из руководства пользователя wget
Цитата
Таким образом определение "wget -A gif,jpg" укажет Wget выгружать только файлы заканчивающиеся на "gif" или "jpg", т.е. графические файлы формата GIF или JPEG. С другой стороны, 'wget -A "zelazny*196[0-9]*"' будет выгружать только файлы с именами начинающимися с "zelazny" и содержащие числа от 1960 до 1969 далее в любом месте имени файла

(для некоторых задач может подойти на 100%)

2) только щас в голову пришло: выкачать с помощью wget сайт (одна строка кода), а потом вырезать из log-файла все ссылки (еще несколько строчек) и не надо никаких дополнительных модулей

3) может еще что-нибудь придет в голову, посмотрим smile

Пока экспериментирую...



--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Sadok
Дата 20.7.2005, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Usya
Цитата
1) из руководства пользователя wget

Это только для ftp подходит, т.к.:

Заметим, что эти две опции не касаются выгрузки HTML файлов, Wget должен выгружать все HTML документы чтобы выяснять куда ему двигаться дальше, в противном случае рекурсивная выгрузка становится просто бессмысленной.

Это сообщение отредактировал(а) Sadok - 20.7.2005, 08:34
PM   Вверх
Usya
Дата 20.7.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Sadok

Так я не против того, что wget приходится выгружать html-файлы. Это видно по результатам выполнения программы (или по log-файлу). Хотя, честно говоря, до последнего надеялся на другое. Wget, как я понял, сначала их закачивает, а потом сам и удаляет.

Дело в другом: проверять html-файлы в любом случае придется. Кроме того, мне абсолютно не нужны файлы, на которые нет ссылок. Если разработчик сайта решил сделать для себя несколько временных файлов, путь к которым знает только он, или забыл просто удалить отработанные файлы - это его дело. Меня это не интересует.

Однако чтобы собрать все ссылки (с последующей обработкой, если нужно), используя wget, можно просто оптимизировать код, тем более, что wget как раз под это и заточен. Выкачал c сайта html-файлы или просто задал какую-нибудь ключевую комбинацию для поиска (которая в принципе не должна встретиться, чтоб случайно не закачать лишнего), из log-файла собрал все ссылки и обрабатывай их сколько хочешь. А можно сразу выкачивать нужные файлы (само собой это не касается html-файлов). Плюс к тому же не надо устанавливать дополнительные модули - мелочь, а приятно smile

Возможно есть и другие варианты, но пока это наиболее оптимальный из тех, до которых я докопался.
Впрочем, все нюансы пока не изведал, так что может что-то придется изменить.
Правда говорят, что wget достаточно не плох в качестве качалки, по идее должен собирать все (или почти все) ссылки...
Время покажет...
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.