2

Rubyを使用して、フォローしたいリダイレクトを返すことがあるWebページをスクレイピングしています。それを行う Ruby gem はたくさんありますが、問題があります。

RubyURI.parseは、技術的に無効であるが次のようなブラウザで動作するいくつかの URI で爆発します。"http://www.google.com/?q=<>"

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

httpパーティ:

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

オープン URI:

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

これを機能させるにはどうすればよいですか?

4

4 に答える 4

3

Mechanize は、私のお気に入りの Web スクレイピングの宝石です。

Mechanize ライブラリは、Web サイトとの対話を自動化するために使用されます。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 を簡単にスクレイピングできます。

ここに を開始するためのガイドとドキュメントがあります。

于 2012-11-06T21:32:17.143 に答える
2

Typhoeusの作品:

require 'typhoeus'
Typhoeus::VERSION #=> "0.5.0.rc" 
Typhoeus.get("http://bitly.com/ReeuYv", followlocation: true).body
于 2012-11-06T20:13:34.240 に答える
1

縁石はうまくいくようです:

require 'curb'
Curl.get("http://bitly.com/ReeuYv") { |c| 
  c.follow_location = true 
}.body_str  #=>  works
于 2012-11-06T19:51:01.473 に答える
0

これはうまくいきます:

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


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


URI.parse(uri) #=> no error
于 2012-11-06T20:02:06.240 に答える