build_opener - Python''s `urllib2`: ¿Por qué obtengo el error 403 cuando` urlopen` una página de Wikipedia?
urllib2 in python (6)
Algunos sitios web bloquearán el acceso de las secuencias de comandos para evitar el uso "innecesario" de sus servidores al leer los encabezados que envía urllib. No sé ni puedo imaginar por qué wikipedia hace / haría esto, pero ¿ha intentado falsificar sus encabezados?
Tengo un error extraño al tratar de urlopen
una página de Wikipedia. Esta es la página:
http://en.wikipedia.org/wiki/OpenCola_(drink)
Esta es la sesión de shell:
>>> 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
Esto me sucedió en dos sistemas diferentes en diferentes continentes. ¿Alguien tiene una idea de por qué sucede esto?
Como mencionó Jochen Ritzel, Wikipedia bloquea bots.
Sin embargo, los bots no serán bloqueados si usan la API de PHP. Para obtener la página de Wikipedia titulada "amor":
http://en.wikipedia.org/w/api.php?format=json&action=query&titles=love&prop=revisions&rvprop=content
Hice una solución para esto utilizando php que no está bloqueado por el sitio que necesitaba.
se puede acceder de esta manera:
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()
Esto le devolverá el código html
Muchas veces los sitios web filtran el acceso al verificar si un agente de usuario reconocido accede a ellos. Wikipedia simplemente trata su script como un bot y lo rechaza. Prueba el spoofing como navegador. El siguiente enlace le muestra un artículo para mostrarle cómo hacerlo.
Para solucionar esto, deberá atrapar esa excepción.
try:
f = urllib2.urlopen(''http://en.wikipedia.org/wiki/OpenCola_(drink)'')
except urllib2.HTTPError, e:
print e.fp.read()
Cuando imprimo el mensaje resultante, incluye lo siguiente
"Inglés
Nuestros servidores están experimentando un problema técnico. Esto es probablemente temporal y debería arreglarse pronto. Por favor, inténtelo de nuevo en unos minutos. "
Recuperación de datos: los Bots no se pueden usar para recuperar contenido masivo para ningún uso que no esté directamente relacionado con una tarea de bot aprobada. Esto incluye la carga dinámica de páginas de otro sitio web, lo que puede ocasionar que el sitio web quede en la lista negra y se le niegue el acceso permanentemente. Si desea descargar contenido en bloque o duplicar un proyecto, hágalo descargando o alojando su propia copia de nuestra base de datos.
Es por eso que Python está bloqueado. Se supone que debes descargar los volcados de datos .
De todos modos, puedes leer páginas como esta en Python 2:
req = urllib2.Request(url, headers={''User-Agent'' : "Magic Browser"})
con = urllib2.urlopen( req )
print con.read()
O en Python 3:
import urllib
req = urllib.request.Request(url, headers={''User-Agent'' : "Magic Browser"})
con = urllib.request.urlopen( req )
print con.read()