2012-06-07 3 views
8

я собирался через учебники Руби, предусмотренных в http://ruby.bastardsbook.com/ и я столкнулся следующий код:`open_http ': 403 Forbidden (OpenURI :: HTTPError) для строки„Steve_Jobs“, но не для какой-либо другой строки

require "open-uri" 

remote_base_url = "http://en.wikipedia.org/wiki" 
r1 = "Steve_Wozniak" 
r2 = "Steve_Jobs" 
f1 = "my_copy_of-" + r1 + ".html" 
f2 = "my_copy_of-" + r2 + ".html" 

# read the first url 
remote_full_url = remote_base_url + "/" + r1 
rpage = open(remote_full_url).read 

# write the first file to disk 
file = open(f1, "w") 
file.write(rpage) 
file.close 

# read the first url 
remote_full_url = remote_base_url + "/" + r2 
rpage = open(remote_full_url).read 

# write the second file to disk 
file = open(f2, "w") 
file.write(rpage) 
file.close 

# open a new file: 
compiled_file = open("apple-guys.html", "w") 

# reopen the first and second files again 
k1 = open(f1, "r") 
k2 = open(f2, "r") 

compiled_file.write(k1.read) 
compiled_file.write(k2.read) 

k1.close 
k2.close 
compiled_file.close 

код выдает следующий след:

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http': 403 Forbidden (OpenURI::HTTPError) 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open' 
    from /Users/arkidmitra/tweetfetch/samecode.rb:11 

Моя проблема заключается не в том, что код не но всякий раз, когда я меняю r2 ни к чему, кроме Steve_Jobs, это работает. Что здесь происходит?

+0

Есть прокси или что-то, что может быть фильтрация URL-адресов? Пробовали ли вы использовать «плохой» URL-адрес через что-то еще на той же машине, например? браузер lynx? –

+0

Ничего подобного. Работает даже с wget "http://en.wikipedia.org/wiki/Steve_Jobs". Я поражен. –

+1

Можете ли вы попробовать установить пользовательский агент как 'open (remote_full_url,« User-Agent »=>« Mozilla/5.0 (Windows NT 6.0; rv: 12.0) Gecko/20100101 Firefox/12.0 FirePHP/0.7.1 »)' on Твоя сторона? – vstm

ответ

2

Я думаю, что это происходит из-за заблокированные записи, как «Стив Джобс», «Аль-Гор» и т.д. Это указано в той же книге, что вы ссылаетесь:

Для некоторых страниц - такие, как Запертая запись Альберта Гора - Википедия будет не отвечать на веб-запрос, если агент-агент не указан. «Пользователь-агент» обычно относится к вашему браузеру, и вы можете увидеть это на , проверяя заголовки, отправляемые для любого запроса страницы в вашем браузере. Предоставляя пару ключ-значение «Пользователь-агент» (я в основном использую «Ruby» и, похоже, работает), мы можем передать его как хеш (я использую константу HEADERS_HASH в примере) в качестве второго аргумент метода call.

Указано позже в http://ruby.bastardsbook.com/chapters/web-crawling/

9

Ваш код работает отлично для меня (Ruby MRI 1.9.3), когда я запрашиваю страницу вики, которая существует.

Когда я запрашиваю страницу wiki, которая НЕ существует, я получаю код ошибки mediawiki 404.

  • Steve_Jobs => Успех
  • Steve_Austin => Успех
  • Steve_Rogers => Успех
  • Steve_Foo => ошибка

Википедия делает тонну кэширования, так что если вы видите reponses для «Steve_Jobs», которые отличаются от других людей, которые действительно существуют, тогда лучше всего угадать, потому что википедия кэширует статью Стив Джобса, потому что он знаменитый и потенциально ding дополнительные проверки/проверки для защиты статьи от быстрых изменений, нарушений и т. д.

Решение для вас: всегда открывайте URL-адрес с помощью строки User Agent.

rpage = open(remote_full_url, "User-Agent" => "Whatever you want here").read 

Детали из Документов Mediawiki: «Когда вы делаете HTTP запросы к веб-службы API MediaWiki, не забудьте указать заголовок User-Agent, который правильно идентифицирует клиента Не используйте по умолчанию User-Agent. предоставляемые вашей клиентской библиотекой, но составляющие пользовательский заголовок, который включает имя и номер версии вашего клиента: что-то вроде «MyCuteBot/0.1».

Вики-код Wikimedia, если вы не предоставляете User-Agent заголовок, или вы отправляете пустую или общую информацию, ваш запрос завершится с ошибкой HTTP 403. См. нашу политику User-Agent. "

+0

Таким образом, я делаю ставку на то, что ваше начальное тестирование на других именах было сделано с помощью браузера, и вы видите результаты кэширования для них. Когда вы нажимаете «Steve_Jobs», он не кэшируется, и поскольку вы не использовали ни одну строку UA, вы получили 403. –

+0

Я могу последовательно воспроизводить это с помощью завитка. Страница вакансий возвращает 403 без UA. Если предоставлен UA, он возвращает нормальный ответ 200. Я попробовал несколько других страниц, и ни у кого не было такого поведения. Weird ... – alienhard

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

  • Нет связанных вопросов^_^