kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Yahoo-Me
Yahoo-Me
Вопрос

`open_http': 403 Forbidden (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, он работает. Что здесь происходит?

9 2012-06-07T04:16:06+00:00 2
 Yahoo-Me
Yahoo-Me
Редактировал вопрос 7-го июня 2012 в 4:53
Программирование
ruby
http-error
open-uri
 joelparkerhenderson
joelparkerhenderson
10-го июня 2012 в 12:56
2012-06-10T00:56:03+00:00
Дополнительно
Источник
Редактировать
#16375554

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

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

  • Steve_Jobs => success (успех)
  • Steve_Austin => успех
  • Steve_Rogers => успех
  • Steve_Foo => ошибка

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

Решение для вас: всегда открывайте 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."

 joelparkerhenderson
joelparkerhenderson
Редактировал ответ 10-го июня 2012 в 2:44
10
0
Решение / Ответ
 Arc
Arc
18-го июня 2012 в 5:49
2012-06-18T17:49:31+00:00
Дополнительно
Источник
Редактировать
#16375555

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

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

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

2
0
Похожие сообщества 6
Чат по Руби
Чат по Руби
2 350 пользователей
Чат-болталка для учеников руби-школы и не только. Сайт школы: https://rubyschool.us Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13 или тут https://graph.org/Pravila-chata-Rubi-shkoly-03-13
Открыть telegram
RubyRush.ru
RubyRush.ru
2 295 пользователей
Дружелюбный чат для начинающих программистов и учеников rubyrush.ru, обсуждаем программирование, ruby и т. п. Правила чата https://telegra.ph/22-09-05-3 Популярные вопросы (с ответами) https://telegra.ph/22-09-17-4 💎🦜
Открыть telegram
pro.rb (Ruby/Rails / RU)
pro.rb (Ruby/Rails / RU)
1 183 пользователей
Язык программирования Ruby: https://ru.wikipedia.org/wiki/Ruby Вакансии: @rubyjob
Открыть telegram
Ruby — вакансии и аналитика
Ruby — вакансии и аналитика
359 пользователей
Публикуем вакансии и запросы на поиск работы по направлению Ruby. Full-time, part-time, remote и разовые подработки. Обмен инсайдами и аналитикой на рынке труда. Тематическое общение: @ruby_ru См. также: @python_jobs, @nodejs_jobs, @devops_jobs
Открыть telegram
Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
345 пользователей
Открыть telegram
Ruby Talks
Ruby Talks
255 пользователей
Национальная Флеймотека
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 17 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией