`Urllib2` Python: почему я получаю ошибку 403, когда я` urlopen` на странице Википедии? - PullRequest
53 голосов
/ 26 июля 2010

У меня странная ошибка при попытке 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

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

Ответы [ 6 ]

123 голосов
/ 26 июля 2010

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

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

Вот почему 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()
10 голосов
/ 26 июля 2010

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

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

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

"Английский

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

5 голосов
/ 26 июля 2010

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

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

1 голос
/ 24 августа 2013

Как упоминал Йохен Ритцель, Википедия блокирует ботов.

Однако боты не будут заблокированы, если они используют API PHP.Чтобы получить страницу Википедии под названием "любовь":

http://en.wikipedia.org/w/api.php?format=json&action=query&titles=love&prop=revisions&rvprop=content

1 голос
/ 26 июля 2010

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

0 голосов
/ 18 декабря 2017

Я сделал обходной путь для этого, используя 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-код

...