解决Ruby破坏的URI.parse,遵循重定向

时间:2012-11-06 19:33:39

标签: ruby-on-rails ruby httparty rest-client faraday

我正在使用Ruby来抓取网页,这些网页有时会返回我想要遵循的重定向。 有许多Ruby宝石可以做到这一点,但有一个问题:

Ruby的URI.parse在某些技术上无效但在"http://www.google.com/?q=<>"

等浏览器中工作的URI上爆炸
URI.parse("http://www.google.com/?q=<>")               #=> error

require 'addressable/uri'
Addressable::URI.parse("http://www.google.com/?q=<>")  #=> works

我尝试的所有HTTP客户端库(HttParty,Faraday,RestClient)在重定向中遇到这样的URI时会中断(这是在ruby 1.9.3上)

其余的客户端:

require 'rest-client'
RestClient.get("http://bitly.com/ReeuYv") #=> explodes

法拉第:

require 'faraday'
require 'faraday_middleware'
Faraday.use(FaradayMiddleware::FollowRedirects)
Faraday.get("http://bitly.com/ReeuYv")    #=> explodes

httparty:

require 'httparty'
HTTParty.get("http://bitly.com/ReeuYv")   # => explodes

开-URI:

require 'open-uri'
open("http://bitly.com/ReeuYv")           # => explodes

我可以做些什么来完成这项工作?

4 个答案:

答案 0 :(得分:3)

Mechanize是我最喜欢的网页抓取宝石。

  

Mechanize库用于自动交互   网站。 Mechanize会自动存储和发送cookie,如下所示   重定向,可以关注链接并提交表单。表单字段可以是   填充并提交。 Mechanize还会跟踪那些网站   你曾作为历史访问过。

require 'mechanize'
agent = Mechanize.new
page = agent.get('http://bitly.com/ReeuYv')
puts page.uri.to_s
=> http://www.google.com/?q=%3C%3E

它使用nokogiri来解析html,这样每个Mechanize::Page对象都可以被视为一个nokogiri对象,所以你可以得到html的一些内容,如

puts page.form('f').q
=> <>

最后一部分可能看起来像黑魔法,但你真的需要自己尝试pp page。它使得HTML易于抓取。

Here是一本入门指南和文档。

答案 1 :(得分:2)

Typhoeus有效:

require 'typhoeus'
Typhoeus::VERSION #=> "0.5.0.rc" 
Typhoeus.get("http://bitly.com/ReeuYv", followlocation: true).body

答案 2 :(得分:1)

Curb似乎有效:

require 'curb'
Curl.get("http://bitly.com/ReeuYv") { |c| 
  c.follow_location = true 
}.body_str  #=>  works

答案 3 :(得分:0)

这将有效:

uri = URI.escape "http://www.google.com/?q=<>"


#=> "http://www.google.com/?q=%3C%3E"


URI.parse(uri) #=> no error