如何在使用Ruby mechanize加载页面之前设置Referer标头?

时间:2012-04-12 13:08:23

标签: ruby http-headers mechanize http-referer

使用Mechanize 2.3设置自定义标头有直接的方法吗?

我尝试了former solution,但得到了:

$agent = Mechanize.new
$agent.pre_connect_hooks << lambda { |p|
  p[:request]['Referer'] = 'https://wwws.mysite.com/cgi-bin/apps/Main'
} 

# ./mech.rb:30:in `<main>': undefined method `pre_connect_hooks' for nil:NilClass (NoMethodError)

3 个答案:

答案 0 :(得分:10)

The docs说:

get(uri, parameters = [], referer = nil, headers = {}) { |page| ... }

所以例如:

agent.get 'http://www.google.com/', [], agent.page.uri, {'foo' => 'bar'}
或者你可能会喜欢:

agent.request_headers = {'foo' => 'bar'}
agent.get url

答案 1 :(得分:3)

你误解了你正在复制的代码。示例中有一个换行符,但它在格式化中消失了,因为它没有标记为代码。 $agent包含nil,因为您在初始化之前尝试使用它。您必须初始化对象然后使用它。试试这个:

$agent = Mechanize.new
$agent.pre_connect_hooks << lambda { |p| p[:request]['Referer'] = 'https://wwws.mysite.com/cgi-bin/apps/Main' }

答案 2 :(得分:2)

对于这个问题,我注意到人们似乎在使用:

page = agent.get("http://www.you.com/index_login/", :referer => "http://www.you.com/")

顺便说一句,现在我测试了这个答案,似乎这不是我实际问题背后的问题:每次访问我正在抓取的网站都需要再次浏览登录序列页面,即使是在几秒钟之后首次登录访问,尽管我总是以yaml格式加载并保存完整的cookie jar。但那当然会引出另一个问题。