【问题标题】:How to set the Referer header before loading a page with Ruby mechanize?如何在使用 Ruby mechanize 加载页面之前设置 Referer 标头?
【发布时间】:2012-04-12 13:08:22
【问题描述】:

是否有使用 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)

【问题讨论】:

  • 这个问题本身没有问题,而且它是有效的,所以我保留了它。甚至为其他被同一件事难住的人发布了答案。另一个问题只是掩盖了我似乎面临的机械化实际问题。但在其他方面与此无关。

标签: ruby http-headers mechanize http-referer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 你不应该接受你自己的答案,而且你的答案不正确,你应该选择pguardiario answer
      • 正如你所建议的,我改变了答案(现在是 2019 年),虽然我没有确认也没有测试过;这种环境早已不复存在。早在 2012 年,我的最终解决方案是唯一对我有用的解决方案,如果有的话。关于库甚至 API 随时间改变其行为和细微差别的影响,有很多话要说。 IE。近八年前曾经是“正确”的东西......
      猜你喜欢
      • 2012-10-13
      • 2018-12-08
      • 2012-08-15
      • 2018-04-28
      • 1970-01-01
      • 2023-03-24
      • 2012-06-09
      • 2012-03-23
      • 2018-11-30
      相关资源
      最近更新 更多