使用Anemone Web Spider进行HTTP基本身份验证

Ser*_*hin 2 ruby web-crawler anemone

我需要从网站的所有页面收集所有"标题".
站点具有HTTP基本身份验证配置.
没有auth我接下来做:

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
Run Code Online (Sandbox Code Playgroud)

但是我对HTTP Basic Auth有一些问题...
我如何使用HTTP Basic Auth从站点收集标题?
如果我尝试使用"Anemone.crawl(" http:// username:password@example.com/ ")",那么我只有第一页标题,但其他链接有http://example.com/风格,我收到401错误.

Ser*_*sev 5

HTTP Basic Auth通过HTTP标头工作.愿意访问受限资源的客户端必须提供身份验证标头,如下所示:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Run Code Online (Sandbox Code Playgroud)

它包含名称和密码,Base64编码.更多信息在维基百科文章中:基本访问身份验证.

我google了一点,没有找到让Anemone接受自定义请求标头的方法.也许你会有更多的运气.

但是我找到了另一个声称可以做到的爬虫:Messie.也许你应该试一试

更新

这里是Anemone设置其请求标头的地方:Anemone :: HTTP.实际上,那里没有定制.你可以monkeypatch它.这样的东西应该工作(把它放在你的应用程序的某个地方):

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
Run Code Online (Sandbox Code Playgroud)

显然,您应该为方法调用的para usernamepasswordparams 提供自己的值basic_auth.这是快速,肮脏和硬编码,是的.但有时你没有时间以适当的方式做事.:)