7

このページからデータを取得したい:

http://www.canadapost.ca/cpotools/apps/track/personal/findByTrackNumber?trackingNumber=0656887000494793

しかし、そのページは次の場所に転送されます:

http://www.canadapost.ca/cpotools/apps/track/personal/findByTrackNumber?execution=eXs1

openそのため、OpenUri からを使用してデータをフェッチしようとすると、次のRuntimeErrorエラーがスローされます。HTTP redirection loop:

リダイレクトしてそのエラーをスローした後にそのデータを取得する方法がよくわかりません。

4

3 に答える 3

23

Mechanizeのようなツールが必要です。その説明から:

Mechanize ライブラリは、Web サイトとの対話を自動化するために使用されます。Mechanize は、Cookie の保存と送信、リダイレクトの追跡、リンクの追跡、フォームの送信を自動的に行うことができます。フォーム フィールドにデータを入力して送信できます。また、Mechanize は、訪問したサイトを履歴として追跡します。

これはまさにあなたが必要とするものです。そう、

sudo gem install mechanize

それから

require 'mechanize'
agent = WWW::Mechanize.new
page = agent.get "http://www.canadapost.ca/cpotools/apps/track/personal/findByTrackNumber trackingNumber=0656887000494793"

page.content # Get the resulting page as a string
page.body # Get the body content of the resulting page as a string
page.search(".somecss") # Search for specific elements by XPath/CSS using nokogiri

ロックンロールの準備が整いました。

于 2010-05-07T19:42:33.473 に答える
1

機械化は素晴らしいツールですが、私は自分のものを「調理」することを好みます。

解析に真剣に取り組んでいる場合は、このコードをご覧ください。毎日、国際レベルで何千ものサイトをクロールするのに役立ちます.

require "open-uri"
require "zlib"
require "nokogiri"
require "sanitize"
require "htmlentities"
require "readability"

def crawl(url_address)
self.errors = Array.new
begin
  begin
    url_address = URI.parse(url_address)
  rescue URI::InvalidURIError
    url_address = URI.decode(url_address)
    url_address = URI.encode(url_address)
    url_address = URI.parse(url_address)
  end
  url_address.normalize!
  stream = ""
  timeout(8) { stream = url_address.open(SHINSO_HEADERS) }
  if stream.size > 0
    url_crawled = URI.parse(stream.base_uri.to_s)
  else
    self.errors << "Server said status 200 OK but document file is zero bytes."
    return
  end
rescue Exception => exception
  self.errors << exception
  return
end
# extract information before html parsing
self.url_posted       = url_address.to_s
self.url_parsed       = url_crawled.to_s
self.url_host         = url_crawled.host
self.status           = stream.status
self.content_type     = stream.content_type
self.content_encoding = stream.content_encoding
self.charset          = stream.charset
if    stream.content_encoding.include?('gzip')
  document = Zlib::GzipReader.new(stream).read
elsif stream.content_encoding.include?('deflate')
  document = Zlib::Deflate.new().deflate(stream).read
#elsif stream.content_encoding.include?('x-gzip') or
#elsif stream.content_encoding.include?('compress')
else
  document = stream.read
end
self.charset_guess = CharGuess.guess(document)
if not self.charset_guess.blank? and (not self.charset_guess.downcase == 'utf-8' or not self.charset_guess.downcase == 'utf8')
  document = Iconv.iconv("UTF-8", self.charset_guess, document).to_s
end
document = Nokogiri::HTML.parse(document,nil,"utf8")
document.xpath('//script').remove
document.xpath('//SCRIPT').remove
for item in document.xpath('//*[translate(@src, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")]')
  item.set_attribute('src',make_absolute_address(item['src']))
end
document = document.to_s.gsub(/<!--(.|\s)*?-->/,'')
self.content = Nokogiri::HTML.parse(document,nil,"utf8")
end
于 2012-09-26T15:21:33.527 に答える
1

このサイトは、セッションでリダイレクト ロジックの一部を実行しているようです。最初のリクエストで送信されるセッション Cookie を返送しないと、リダイレクト ループに陥ります。私見は、それは彼らの側のくだらない実装です。

しかし、私はクッキーを彼らに返そうとしましたが、うまくいきませんでした。

于 2010-05-03T18:33:55.133 に答える