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

有没有一种直接的方法来使用Mechanize 2.3设置自定义标头?

我试过以前的解决方案,但得到:

$agent = Mechanize.new $agent.pre_connect_hooks << lambda { |p| p[:request]['Referer'] = 'https://wwws.mysite.com/cgi-bin/apps/Main' } # ./mech.rb:30:in `': undefined method `pre_connect_hooks' for nil:NilClass (NoMethodError) 

文档说:

 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 

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

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

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

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

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