Python 'urllib2': Почему я получаю ошибку 403 когда я 'urlopen' страница Wikipedia?

У меня есть странная ошибка при попытке к urlopen определенная страница из Википедии. Это - страница:

http://en.wikipedia.org/wiki/OpenCola_ (напиток)

Это - сессия оболочки:

>>> f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
Traceback (most recent call last):
  File "C:\Program Files\Wing IDE 4.0\src\debug\tserver\_sandbox.py", line 1, in 
    # Used internally for debug sandbox under external interpreter
  File "c:\Python26\Lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "c:\Python26\Lib\urllib2.py", line 397, in open
    response = meth(req, response)
  File "c:\Python26\Lib\urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "c:\Python26\Lib\urllib2.py", line 435, in error
    return self._call_chain(*args)
  File "c:\Python26\Lib\urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "c:\Python26\Lib\urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden

Это произошло со мной в двух различных системах на различных континентах. У кого-либо есть идея, почему это происходит?

53
задан Ram Rachum 26 July 2010 в 04:53
поделиться

4 ответа

Позиция Википедии :

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

Вот почему Python заблокирован. Вы должны загрузить дампы данных .

В любом случае, вы можете читать такие страницы в Python 2:

req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib2.urlopen( req )
print con.read()

или в Python 3:

import urllib
req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib.request.urlopen( req )
print con.read()
124
ответ дан 7 November 2019 в 08:24
поделиться

Чтобы отладить это, вам нужно перехватить это исключение.

try:
    f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
except urllib2.HTTPError, e:
    print e.fp.read()

Когда я печатаю получившееся сообщение, оно включает следующее

«Английский

Наши серверы в настоящее время испытывают техническая проблема. Это наверное временный и должен быть исправлен в ближайшее время. Пожалуйста, повторите попытку через несколько минут. "

10
ответ дан 7 November 2019 в 08:24
поделиться

Некоторые сайты блокируют доступ скриптов, чтобы избежать "ненужного" использования своих серверов, читая заголовки, которые посылает urllib. Я не знаю и не могу представить, почему Википедия делает/может делать это, но вы пробовали подменить свои заголовки?

.
1
ответ дан 7 November 2019 в 08:24
поделиться

Часто сайты фильтруют доступ, проверяя, что к ним обращается распознанный агент пользователя. Wikipedia просто рассматривает ваш скрипт как бота и отклоняет его. Попробуйте подделаться под браузер. По следующей ссылке вы найдете статью, которая покажет вам, как это сделать.

http://wolfprojects.altervista.org/changeua.php

5
ответ дан 7 November 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: