【问题标题】:Using random key/value from YAML file使用 YAML 文件中的随机键/值
【发布时间】:2016-04-19 18:34:04
【问题描述】:

我正在尝试使用 YAML 文件中的随机键值对,如下所示:

'user_agents':
  'Mozilla': '5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
  'Mozilla': '5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)'
  'Mozilla': '5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16'
  'Mozilla': '4.0 (compatible; MSIE 6.0; Windows NT 5.1)'

使用这个脚本:

require 'mechanize'
require 'yaml'

info = YAML.load_file('test-rand.yml')
@user_agent = info['user_agents'][info.keys.sample]

agent = Mechanize.new
agent.user_agent = @user_agent
if @user_agent.nil?
  puts "The user agent is nil"
else
  puts "Using: #{@user_agent}"
end

但是,在运行此脚本时,我不断收到 The user agent is nil,您如何从 YAML 文件中提取随机键/值?

我也试过@user_agent = info['user_agents'][info[rand(values.size)]]

【问题讨论】:

  • yaml 转换为哈希值,而 ruby​​ 中的哈希值只能包含唯一键,因此实际上您始终只有最后一个键 'Mozilla': '4.0 (compatible; MSIE 6.0; Windows NT 5.1)'。
  • 有没有办法解决这个问题?
  • 使用 yaml 文件中的唯一键。
  • 这没有回答问题,有没有办法解决这个问题,比如给一个键多个值?

标签: ruby random yaml key-value


【解决方案1】:

我想我想出了一个解决方案,如果有人有更好的解决方案,请告诉我,我将 YAML 文件更改为只有一个 Mozilla 具有多个值:

YAML:

'user_agents':
  'Mozilla': ['5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', '4.0 (compatible; MSIE 6.0; Windows NT 5.1)', '5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16', '5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)'] 

然后我获取键和值,并使用以下方法将 YAML 文件分解为键值对:

info = YAML.load_file('test-rand.yml')
info['user_agents'].each do |k,v|

从那里我将值转换为一个数组,对数组进行采样,并将结果保存到一个变量中,然后我创建了一个名为 @user_agent 的新哈希,并为其提供了 k 的键和 @987654327 的值@:

arr_val = v.to_a.sample
@user_agent = {k => arr_val.to_s}

完整脚本:

require 'mechanize'
require 'yaml'

info = YAML.load_file('test-rand.yml')
info['user_agents'].each do |k,v|
  arr_val = v.to_a.sample
  @user_agent = {k => arr_val.to_s}
end

agent = Mechanize.new
agent.user_agent = @user_agent
if @user_agent.nil?
  puts "The user agent is nil"
else
  puts "Using: #{@user_agent}"
end
#<= Using: {"Mozilla"=>"5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16"}
#<= Using: {"Mozilla"=>"5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"}
#<= Using: {"Mozilla"=>"4.0 (compatible; MSIE 6.0; Windows NT 5.1)"}

【讨论】:

  • 这就是我要建议的。但您也可以使用破折号代替[] 以避免字符串过长:pastebin.com/H6BAb8wE
  • 嗯,我不知道你能做到这一点!太棒了,谢谢!
【解决方案2】:

如何从 YAML 文件中提取随机键/值?

您当前的 yaml 文件包含相同的密钥 Mozilla。 ruby 将 yaml 文件转换为哈希。在 ruby​​ 哈希中只能包含唯一键。所以你的 yaml 文件看起来像:

=> {"user_agents"=>{"Mozilla"=>"4.0 (compatible; MSIE 6.0; Windows NT 5.1)"}}

具有唯一键的 yml 文件:

'user_agents':
  'Mozilla_1': '5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
  'Mozilla_2': '5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)'
  'Mozilla_3': '5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16'
  'Mozilla_4': '4.0 (compatible; MSIE 6.0; Windows NT 5.1)'

Rails 控制台:

=> info = YAML.load_file('y.yml')
=> {"user_agents"=>
  {"Mozilla_1"=>"5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)",
   "Mozilla_2"=>"5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)",
   "Mozilla_3"=>"5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16",
   "Mozilla_4"=>"4.0 (compatible; MSIE 6.0; Windows NT 5.1)"}}

获取随机值而不是关键:

=> info["user_agents"]["Mozilla_#{rand(1..4)}"]
#> "5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
=>  info["user_agents"]["Mozilla_#{rand(1..4)}"]
#> "5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16"
=> info["user_agents"]["Mozilla_#{rand(1..4)}"]
#> "5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
=> and so on....

【讨论】:

  • 您不能添加到用户代理,否则它们会过时。这些是 REAL 用户代理,我正在尝试使用它们。
  • 我不明白你的意思。
  • 用户代理是当您访问某个网站时从您的计算机发送的内容,以告知该网站您来自哪里。这些用户代理是真正的代理,这意味着它们一直在使用。如果您添加到用户代理,它就不再是同一个代理,并且可能不存在。
  • 问题是如何从 YAML 文件中提取随机键/值?我发布问题的答案。
  • 嘿,如果你有多个不同的键怎么办?
猜你喜欢
  • 2022-07-25
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2019-07-30
  • 2020-09-23
  • 2023-04-07
  • 2012-11-10
  • 2020-12-28
相关资源
最近更新 更多