0

Ruby では、次のように 301/302 リダイレクトに従って mechanize を使用すると、

require 'mechanize'

m = WWW::Mechanize.new
m.get('http://google.com')

リダイレクトされた機械化されたページのリストを取得する方法は? ( http://google.com => http://www.google.com => http://google.com.uaのように)

OK、これがリダイレクトを担当する mechanize のコードです

 elsif res_klass <= Net::HTTPRedirection
        return page unless follow_redirect?
        log.info("follow redirect to: #{ response['Location'] }") if log
        from_uri  = page.uri
        raise RedirectLimitReachedError.new(page, redirects) if redirects + 1 > redirection_limit
        redirect_verb = options[:verb] == :head ? :head : :get
        page = fetch_page(  :uri => response['Location'].to_s,
                            :referer => page,
                            :params  => [],
                            :verb => redirect_verb,
                            :redirects => redirects + 1
                         )
        @history.push(page, from_uri)
        return page

しかし m.history.map {|p| puts p.uri} は、最後のページの uri の 3 倍を示します。

4

2 に答える 2

2

ここで重要なのは、Mechanize に組み込まれているロギングを利用することです。以下は、組み込みの Rails ロギング機能を使用した完全なコード サンプルです。

「機械化」が必要

「ロガー」が必要

mechanize_logger = Logger.new('log/mechanize.log')

mechanize_logger.level = ロガー::情報

URL = 'http://google.com'

エージェント = Mechanize.new

agent.log = mechanize_logger

エージェント.get(URL)

次に、ログ ディレクトリの log/mechanize.log の出力を確認すると、中間 URL を含む機械化プロセス全体が表示されます。

于 2012-01-20T18:56:19.563 に答える
0

よくわかりませんが、次の 2 つのことを試してみてください。

  1. m.history[i].uriget()の後にあるものを参照してください

  2. 次のようなものが必要になる場合があります。

    0..99 の m.redirection_limit の場合
      始める
        m.get(URL)
        壊す
        レスキュー WWW::Mechanize::RedirectLimitReachedError
          # ここのコードは制御を取得できます
          # 中間リダイレクト レベル
      終わり
    終わり
于 2009-08-29T22:02:05.453 に答える