首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Anemone Web Spider进行HTTP基本身份验证

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

Stack Overflow用户
提问于 2013-05-31 05:22:01
回答 1查看 1K关注 0票数 2

我需要收集所有的“标题”从网站的所有页面。

站点具有HTTP基本身份验证配置。

在不使用身份验证的情况下,我将执行以下操作:

代码语言:javascript
复制
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 Basic Auth有一些问题...

如何使用HTTP Basic Auth从站点收集书目?

如果我尝试使用"Anemone.crawl("http://username:password@example.com/")“,那么我只有第一个页面标题,但其他链接具有http://example.com/样式,并且我收到401error。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-31 05:34:16

HTTP Basic Auth通过HTTP headers工作。希望访问受限资源的客户端必须提供身份验证头,如下图所示:

代码语言:javascript
复制
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

它包含名称和密码,采用base64编码。更多信息请参见维基百科文章:Basic Access Authentication

我用谷歌搜索了一下,没有找到让Anemone接受自定义请求头的方法。也许你会有更多的运气。

但我发现了另一个自称可以做到的爬虫程序:Messie。也许你应该试一试

更新

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

代码语言:javascript
复制
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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16846089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档