2016-04-19 6 views
-1

Я пытаюсь использовать случайный ключ, пару значений из YAML файл, который выглядит следующим образом:Используя случайный ключ/значение из 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)]]

+0

YAML перевести хэш и хэш в рубин может содержать только уникальные ключи, так что вы на самом деле всегда имеет только последний ключ '' Mozilla ':' 4.0 (compatible; MSIE 6.0; Windows NT 5.1). –

+0

Есть ли способ обойти это? – 13aal

+0

используйте уникальные ключи в файле yaml. –

ответ

2

Я думаю, что я понял, решение для этого, если у кого есть лучший друг, пожалуйста, дайте мне знать, я изменил файл 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 и значение arr_val.to_s:

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)"} 
+0

Вот что я собирался предложить. Но вы также можете использовать тире вместо '[]', чтобы избежать слишком длинных строк: http://pastebin.com/H6BAb8wE –

+0

Хм, я понятия не имел, что вы можете это сделать! Удивительное спасибо! – 13aal

1

Как вы тянете случайный ключ/значение из файла YAML?

В вашем текущем файле yaml содержатся те же ключи Mozilla. Ruby конвертировать yaml файл в хэш. В рубиновом хеше могут содержаться только уникальные ключи. Так что ваш файл 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)' 

Рельсы консоли:

=> 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.... 
+0

Вы не можете добавлять к пользовательским агентам, или это делает их устаревшими. Это _REAL_ пользовательские агенты, и я пытаюсь их использовать. – 13aal

+0

Я не могу понять, что вы имеете в виду. –

+0

Пользовательский агент - это то, что отправлено с вашего компьютера, когда вы переходите на веб-сайт, чтобы рассказать о том, откуда вы пришли. Эти пользовательские агенты являются реальными агентами, то есть они используются все время.Если вы добавите пользовательский агент, это уже не тот же агент и, вероятно, не существует. – 13aal

Смежные вопросы