是否有像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上有很多使用示例 。
下面是使用pQuery
的get_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工具可用于网页抓取。 最难的部分是选择使用哪一个!