Вызов Python urllib.urlopen() не работает с URL, который принимает браузер
Вопрос
Если я укажу Firefox на http://bitbucket.org/tortoisehg/stable/wiki/Home/ReleaseNotes, Я получаю страницу HTML.Но если я попробую это на Python:
import urllib site = 'http://bitbucket.org/tortoisehg/stable/wiki/Home/ReleaseNotes' req = urllib.urlopen(site) text = req.read()
Я получаю следующее:
500 Внутренняя ошибка сервера Сервер столкнулся с внутренней ошибкой или неправильной настройкой и не смог выполнить ваш запрос.
Что я делаю не так?
Решение
Вы не делаете ничего плохого, bitbucket выполняет некоторое обнаружение пользовательского агента (например, для обнаружения клиентов mercurial).Просто изменение пользовательского агента исправляет это (если у него нет urllib
в качестве подстроки).
Вы должны заполнить вопрос, касающийся этого: http://bitbucket.org/jespern/bitbucket/issues/new/
Другие советы
На первый взгляд, вы не делаете ничего плохого, и, как говорится на странице ошибок, вам следует связаться с администраторами сайта, потому что именно у них есть журналы сервера, которые могут объяснить, что происходит.К счастью, администраторы сайта bitbucket - дружелюбная компания!
Без сомнения, существует какой-то заголовок или комбинация заголовков, которые браузеры устанавливают одним способом, urllib - другим, и в последнем случае ошибка на сервере устраняется.Возможно, вы захотите точно увидеть, какие заголовки отправляются, напримерс помощью firebug в Firefox и воспроизводите их до тех пор, пока не изолируете точно ошибку сервера;скорее всего, это будет пользовательский агент или какой-нибудь заголовок типа "принять", который исправляет эту ошибку.
Я не думаю, что вы делаете что-то не так - похоже, этот сервер только что вышел из строя?Ваш скрипт отлично сработал для меня ("текст" содержал те же данные, что и отображаемые в браузере).