Есть ли такой модуль, как Perl LWP для Ruby? - PullRequest
7 голосов
/ 26 ноября 2011

В Perl есть модуль LWP :

Коллекция libwww-perl представляет собой набор модулей Perl, который предоставляет простой и согласованный интерфейс прикладного программирования (API) для Всемирной паутины. Основным направлением работы библиотеки является предоставление классов и функций, которые позволяют писать WWW-клиенты. Библиотека также содержит модули более общего назначения и даже классы, помогающие реализовать простые HTTP-серверы.

Есть ли аналогичный модуль (гем) для Ruby?

Обновление

Вот пример функции, которую я сделал для извлечения URL-адресов с определенного веб-сайта.

use LWP::UserAgent;
use HTML::TreeBuilder 3;
use HTML::TokeParser;

sub get_gallery_urls {
    my $url = shift;

    my $ua = LWP::UserAgent->new;
    $ua->agent("$0/0.1 " . $ua->agent);
    $ua->agent("Mozilla/8.0");

    my $req = new HTTP::Request 'GET' => "$url";
    $req->header('Accept' => 'text/html');

    # send request
    $response_u = $ua->request($req);

    die "Error: ", $response_u->status_line unless $response_u->is_success;

    my $root = HTML::TreeBuilder->new;
    $root->parse($response_u->content);

    my @gu = $root->find_by_attribute("id", "thumbnails");

    my %urls = ();

    foreach my $g (@gu) {
        my @as = $g->find_by_tag_name('a');

        foreach $a (@as) {
            my $u = $a->attr("href");

            if ($u =~ /^\//) {
                $urls{"http://example.com"."$u"} = 1;
            }
        }
    }

    return %urls;
}

Ответы [ 4 ]

10 голосов
/ 26 ноября 2011

Наиболее близким совпадением, вероятно, является httpclient , которое стремится быть эквивалентом LWP. Тем не менее, в зависимости от того, что вы планируете делать, могут быть лучшие варианты. Если вы планируете переходить по ссылкам, заполнять формы и т. Д. Для очистки веб-содержимого, вы можете использовать Mechanize , который аналогичен модулю perl с тем же именем. Есть также более специфичные для Ruby гемы, такие как превосходный Rest-клиент и HTTParty (мой личный фаворит). Дополнительную информацию см. В категории HTTP-клиенты Ruby Toolbox .

Обновление : Вот пример того, как найти все ссылки на странице в Mechanize (Ruby, но это будет похоже на Perl):

require 'rubygems'
require 'mechanize'

agent = Mechanize.new

page = agent.get('http://example.com/')

page.links.each do |link|
  puts link.text
end

P.S. Как бывший экс-Perler, я беспокоился о том, чтобы отказаться от превосходного CPAN - я бы нарисовал себя в углу с Руби? Разве я не смогу найти эквивалент модуля, на который я полагаюсь? Это оказалось совсем не проблемой, и в последнее время все было наоборот: Ruby (наряду с Python), как правило, первым получает поддержку клиентов для новых платформ / веб-сервисов и т. Д.

3 голосов
/ 26 ноября 2011

Я использовал Perl годами и мне нравился LWP.Это был отличный инструмент.Тем не менее, вот как я могу извлечь URL-адреса со страницы.Это не паукообразный сайт, но это было бы просто:

require 'open-uri'
require 'uri'

urls = URI.extract(open('http://example.com').read)
puts urls

Получив результат в виде:

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
http://www.w3.org/1999/xhtml
http://www.icann.org/
mailto:iana@iana.org?subject=General%20website%20feedback

Запись в качестве метода:

require 'open-uri'
require 'uri'

def get_gallery_urls(url)
  URI.extract(open(url).read)
end

или, ближе к исходной функции, выполняя ее Ruby-way:

def get_gallery_urls(url)
  URI.extract(open(url).read).map{ |u| 
    URI.parse(u).host ? u : URI.join(url, u).to_s
  }
end

или, следуя ближе к исходному коду:

require 'nokogiri'
require 'open-uri'
require 'uri'

def get_gallery_urls(url)
  Nokogiri::HTML(
    open(url)
  )
    .at('#thumbnails')
    .search('a')
    .map{ |link|
      href = link['href']
      URI.parse(link[href]).host \
        ? href \
        : URI.join(url, href).to_s
    }
end

Oneиз того, что привлекло меня в Ruby, это его способность быть читаемым, но в то же время быть кратким.

Если вы хотите использовать свои собственные функции на основе TCP / IP, стандартная сетевая библиотека Ruby является отправной точкой.По умолчанию вы получаете:

net/ftp
net/http
net/imap
net/pop
net/smtp
net/telnet

с ssh, scp, sftp на основе SSL и другими, доступными в виде гемов.Используйте gem search net -r | grep ^net-, чтобы увидеть короткий список.

3 голосов
/ 26 ноября 2011

Вот как ваша функция может выглядеть в ruby.

require 'rubygems'
require "mechanize"

def get_gallery_urls url
    ua = Mechanize.new
    ua.user_agent = "Mozilla/8.0"
    urls = {}

    doc = ua.get url
    doc.search("#thumbnails a").each do |a|
        u = a["href"]
        urls["http://example.com#{u}"] = 1 if u =~ /^\//
    end

    urls
end

Намного приятнее:)

1 голос
/ 05 января 2012

Это больше ответ для любого, кто смотрит на этот вопрос и ему нужно знать, что проще / лучше / отличается от общего анализа веб-страниц с помощью Perl по сравнению с использованием LWP (и даже WWW::Mechanize).

Вот быстрый выбор модулей очистки веб-страниц на CPAN:

NB.Выше приведен только в алфавитном порядке, поэтому, пожалуйста, выберите ваш любимый яд:)

Для большинства моих недавних поисков в Интернете я использовал pQuery.Вы можете видеть, что есть довольно много примеров использования на SO .

Ниже приведен пример get_gallery_urls с использованием pQuery:

use strict;
use warnings;
use pQuery;

sub get_gallery_urls {
    my $url = shift;
    my %urls;

    pQuery($url)
        ->find("#thumbnails a")
        ->each( sub {
            my $u = $_->getAttribute('href');
            $urls{'http://example.com' . $u} = 1 if $u =~ /^\//;
        });

    return %urls;
}

PS.Как сказал Daxim в комментариях, существует множество отличных Perl-инструментов для просмотра веб-страниц.Самое сложное - просто выбрать, какой из них использовать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...