2

サイトのすべてのページからすべての「タイトル」を収集する必要があります。
サイトには HTTP 基本認証構成があります。
認証なしで次に行います:

require 'anemone'
Anemone.crawl("http://example.com/") do |anemone|
  anemone.on_every_page do |page|
    puts page.doc.at('title').inner_html rescue nil
  end
end

しかし、HTTP 基本認証に問題があります... HTTP 基本認証
を使用してサイトからタイトルを収集するにはどうすればよいですか?
「Anemone.crawl(" http://username:password@example.com/ ")" を使用しようとすると、最初のページのタイトルしかありませんが、他のリンクにはhttp://example.com/スタイルがあり、401 を受け取りました。エラー。

4

1 に答える 1

5

HTTP 基本認証は、HTTP ヘッダーを介して機能します。制限されたリソースにアクセスするクライアントは、次のような認証ヘッダーを提供する必要があります。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Base64 でエンコードされた名前とパスワードが含まれています。詳細については、ウィキペディアの記事: Basic Access Authenticationを参照してください。

私は少しグーグルで検索しましたが、アネモネにカスタムリクエストヘッダーを受け入れさせる方法が見つかりませんでした. たぶん、あなたはもっと幸運になるでしょう。

しかし、それができると主張する別のクローラーを見つけました: Messie . 試してみるといいかもしれません

アップデート

Anemone がリクエスト ヘッダーを設定する場所は、Anemone::HTTPです。確かに、そこにはカスタマイズはありません。モンキーパッチできます。このようなものが動作するはずです (これをアプリのどこかに置いてください):

module Anemone
  class HTTP
    def get_response(url, referer = nil)
      full_path = url.query.nil? ? url.path : "#{url.path}?#{url.query}"

      opts = {}
      opts['User-Agent'] = user_agent if user_agent
      opts['Referer'] = referer.to_s if referer
      opts['Cookie'] = @cookie_store.to_s unless @cookie_store.empty? || (!accept_cookies? && @opts[:cookies].nil?)

      retries = 0
      begin
        start = Time.now()
        # format request
        req = Net::HTTP::Get.new(full_path, opts)
        response = connection(url).request(req)
        finish = Time.now()
        # HTTP Basic authentication
        req.basic_auth 'your username', 'your password' # <<== tweak here
        response_time = ((finish - start) * 1000).round
        @cookie_store.merge!(response['Set-Cookie']) if accept_cookies?
        return response, response_time
      rescue Timeout::Error, Net::HTTPBadResponse, EOFError => e
        puts e.inspect if verbose?
        refresh_connection(url)
        retries += 1
        retry unless retries > 3
      end
    end
  end
end

明らかに、メソッド呼び出しのusernameおよびpasswordparams に独自の値を指定する必要があります。basic_authはい、それは迅速で汚いハードコードです。しかし、物事を適切に行う時間がない場合もあります。:)

于 2013-05-30T21:34:15.877 に答える