是否有像Perl的LWP for Ruby这样的模块?

在Perl中有一个LWP模块 :

libwww-perl集合是一组Perl模块,它为万维网提供简单而一致的应用程序编程接口(API)。 该库的主要重点是提供允许您编写WWW客户端的类和函数。 该库还包含更常用的模块,甚至包含可帮助您实现简单HTTP服务器的类。

Ruby有类似的模块(gem)吗?

更新

以下是我从特定网站中提取URL的function示例。

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; } 

最接近的匹配可能是httpclient ,其目的是相当于LWP。 但是,根据您的计划,可能会有更好的选择。 如果您计划关注链接,填写表单等以便抓取Web内容,您可以使用与perl模块类似的Mechanize 。 还有更多特定于Ruby的gem,例如优秀的Rest-client和HTTParty (我个人最喜欢的)。 有关更大的列表,请参阅Ruby Toolbox的HTTP客户端类别 。

更新 :这是一个如何在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 

PS作为一名前Perler,我曾经担心放弃优秀的CPAN – 我会把自己画成Ruby的角落吗? 难道我无法找到与我依赖的模块相当的东西吗? 事实certificate这根本不是问题,事实上最近恰恰相反:Ruby(以及Python)往往是第一个获得客户支持新平台/ Web服务等的人。

这是你的函数在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 

好多了:)

我使用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/
邮寄地址:iana@iana.org主题=总%20website%20feedback

把它写成一种方法:

 require 'open-uri' require 'uri' def get_gallery_urls(url) URI.extract(open(url).read) end 

或者,在使用Ruby方式时更接近原始函数:

 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 

吸引我使用Ruby的一个原因是它具有可读性,同时仍然简洁。

如果您想要自己编写基于TCP / IP的函数,Ruby的标准Net库就是起点。 默认情况下,您获得:

净/ FTP
净/ HTTP
净/ IMAP
网/ POP
净/ SMTP
净/远程登录

使用基于SSL的ssh,scp,sftp和其他可用作gem的。 使用gem search net -r | grep ^net- gem search net -r | grep ^net-看一个简短的清单。

对于任何看过这个问题并且需要知道与使用LWP (甚至是WWW::Mechanize )相比,使用Perl进行一般网络抓取的更简单/更好/不同的替代方案,这更能解决问题。

以下是CPAN上快速选择的网络抓取模块:

  • Mojo::UserAgent
  • pQuery
  • Scrappy
  • Web::Magic
  • Web::Scraper
  • Web::Query

NB。 以上只是按字母顺序排列所以请选择你最喜欢的毒药:)

对于我最近的网页抓取,我一直在使用pQuery 。 您可以看到SO上有很多使用示例 。

下面是使用pQueryget_gallery_urls示例:

 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工具可用于网页抓取。 最难的部分是选择使用哪一个!