Подтвердить что ты не робот

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

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

http://en.wikipedia.org/wiki/OpenCola_(drink)

Это сеанс оболочки:

>>> 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 <module>
    # 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

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

4b9b3361

Ответ 1

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

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

Вот почему 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()

Ответ 2

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

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

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

"Английский

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

Ответ 3

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

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

Ответ 4

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

Ответ 6

Я сделал обходной путь для этого, используя php, который не блокируется нужным вам сайтом.

он может быть доступен следующим образом:

path='http://phillippowers.com/redirects/get.php? 
file=http://website_you_need_to_load.com'
req = urllib2.Request(path)
response = urllib2.urlopen(req)
vdata = response.read()

Это вернет вам HTML-код