我正在使用Ruby来抓取网页,这些网页有时会返回我想要遵循的重定向。 有许多Ruby宝石可以做到这一点,但有一个问题:
Ruby的URI.parse
在某些技术上无效但在"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
require 'httparty'
HTTParty.get("http://bitly.com/ReeuYv") # => explodes
require 'open-uri'
open("http://bitly.com/ReeuYv") # => explodes
我可以做些什么来完成这项工作?
答案 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