我需要收集所有"标题"来自网站的所有页面 站点具有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
但我对HTTP Basic Auth有一些问题...
如何使用HTTP Basic Auth从站点收集标题?
如果我尝试使用" Anemone.crawl(" http://username:password@example.com/")"然后我只有第一页标题,但其他链接有http://example.com/样式,我收到401错误。
答案 0 :(得分:5)
HTTP Basic Auth通过HTTP标头工作。愿意访问受限资源的客户端必须提供身份验证标头,如下所示:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
它包含名称和密码,Base64编码。更多信息在维基百科文章中:Basic Access Authentication。
我用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
显然,您应该为username
方法调用password
和basic_auth
参数提供自己的值。这是快速,肮脏和硬编码,是的。但有时你没有时间以适当的方式做事。 :)