`open_http': 403 Запрещено (OpenURI::HTTPError) для строки"Steve_Jobs", но не для любой другой строки
Я просматривал учебники по Ruby, предоставленные по адресу http://ruby.bastardsbook.com/ и обнаружил следующий код:
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, он работает Что здесь происходит?
2 ответа
Я думаю, что это происходит для заблокированных записей, таких как "Стив Джобс", "Аль-Гор" и т. Д. Это указано в той же книге, на которую вы ссылаетесь:
На некоторых страницах, таких как заблокированная запись Эла Гора, Википедия не будет отвечать на веб-запрос, если не указан User-Agent. "Пользователь-агент" обычно относится к вашему браузеру, и вы можете увидеть это, проверив заголовки, которые вы отправляете для любого запроса страницы в вашем браузере. Предоставляя пару ключ-значение "Пользователь-Агент" (я в основном использую "Рубин", и это, кажется, работает), мы можем передать его как хеш (в этом примере я использую константу HEADERS_HASH) в качестве второго аргумента вызов метода.
Это указано позже на http://ruby.bastardsbook.com/chapters/web-crawling/
Ваш код работает нормально для меня (Ruby MRI 1.9.3), когда я запрашиваю вики-страницу, которая существует.
Когда я запрашиваю вики-страницу, которая НЕ существует, я получаю код ошибки mediawiki 404.
- Steve_Jobs => успех
- Steve_Austin => успех
- Steve_Rogers => успех
- Steve_Foo => ошибка
Википедия делает кучу кеширования, поэтому, если вы видите ответы для "Steve_Jobs", которые отличаются от других людей, которые существуют, то лучше всего предположить, что википедия кэширует статью Стива Джобса, потому что он известен, и потенциально добавляет дополнительные проверки проверки для защиты статьи от быстрых изменений, повреждений и т. д.
Решение для вас: всегда открывайте 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".
На вики-сайте Викимедиа, если вы не укажете заголовок User-Agent или пустой или общий, ваш запрос не будет выполнен с ошибкой HTTP 403. Ознакомьтесь с нашей политикой User-Agent."