2012-06-07 13 views
8

que iba a través de los tutoriales de Ruby proporcionados en http://ruby.bastardsbook.com/ y me encontré con el siguiente código:`open_http ': 403 Forbidden (OpenURI :: HTTPError) para los 'Steve_Jobs' cuerda pero no para cualquier otra cadena

require "open-uri" 

remote_base_url = "http://en.wikipedia.org/wiki" 
r1 = "Steve_Wozniak" 
r2 = "Steve_Jobs" 
f1 = "my_copy_of-" + r1 + ".html" 
f2 = "my_copy_of-" + r2 + ".html" 

# read the first url 
remote_full_url = remote_base_url + "/" + r1 
rpage = open(remote_full_url).read 

# write the first file to disk 
file = open(f1, "w") 
file.write(rpage) 
file.close 

# read the first url 
remote_full_url = remote_base_url + "/" + r2 
rpage = open(remote_full_url).read 

# write the second file to disk 
file = open(f2, "w") 
file.write(rpage) 
file.close 

# open a new file: 
compiled_file = open("apple-guys.html", "w") 

# reopen the first and second files again 
k1 = open(f1, "r") 
k2 = open(f2, "r") 

compiled_file.write(k1.read) 
compiled_file.write(k2.read) 

k1.close 
k2.close 
compiled_file.close 

el código de error con el siguiente traza:

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http': 403 Forbidden (OpenURI::HTTPError) 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open' 
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:30:in `open' 
    from /Users/arkidmitra/tweetfetch/samecode.rb:11 

Mi problema no es que el código falla, sino que cada vez que cambio r2 a otra cosa que no sea Steve_Jobs, funciona. ¿Que está sucediendo aquí?

+0

Tienes un proxy o algo que podría ser URL de filtrado? ¿Has intentado golpear la url "mala" a través de otra cosa en la misma máquina, p. el buscador de linces? –

+0

Nada como tal. Funciona incluso con un wget "http://en.wikipedia.org/wiki/Steve_Jobs". Estoy asombrado. –

+1

Puede intentar configurar el agente de usuario como 'abrir (remote_full_url," User-Agent "=>" Mozilla/5.0 (Windows NT 6.0; rv: 12.0) Gecko/20100101 Firefox/12.0 FirePHP/0.7.1 ")' en ¿tu lado? – vstm

Respuesta

2

creo que esto sucede para las entradas bloqueadas hacia abajo como "Steve Jobs", "Al-Gore", etc. Esto se especifica en el mismo libro que usted se refiere a:

Para algunas páginas - como Entrada bloqueada de Al Gore - Wikipedia no responderá a una solicitud web si no se especifica un User-Agent. El "User-Agent" normalmente hace referencia a su navegador, y puede verlo en inspeccionando los encabezados que envía para cualquier solicitud de página en su navegador. Al proporcionar un par clave-valor "User-Agent" (básicamente uso "Ruby" y parece funcionar), podemos pasarlo como un hash (utilizo el HEADERS_HASH constante en el ejemplo) como el segundo argumento del método llamada.

Se especifica más adelante en http://ruby.bastardsbook.com/chapters/web-crawling/

9

Su código funciona bien para mí (Ruby MRI 1.9.3) cuando solicito una página wiki que existe.

Cuando solicito una página wiki que NO existe, obtengo un código de error mediumwiki 404.

  • Steve_Jobs => éxito
  • Steve_Austin => éxito
  • Steve_Rogers => éxito
  • Steve_Foo => Error

Wikipedia hace un tonelada de almacenamiento en caché, así que si ves respuestas para "Steve_Jobs" que son diferentes a otras personas que existen, entonces mejor adivine esto es porque Wikipedia está almacenando en el artículo de Steve Jobs porque es famoso, y potencialmente ad Haga comprobaciones/verificaciones adicionales para proteger el artículo de cambios rápidos, defectos, etc.

La solución para usted: siempre abra la url con una cadena de agente de usuario.

rpage = open(remote_full_url, "User-Agent" => "Whatever you want here").read 

detalles de los documentos MediaWiki: "Al realizar peticiones HTTP a la API de servicios web de MediaWiki, asegúrese de especificar un encabezado User-Agent que identifica adecuadamente a su cliente No utilice el valor por defecto User-Agent. proporcionado por su biblioteca cliente, pero crea un encabezado personalizado que incluye el nombre y el número de versión de su cliente: algo así como "MyCuteBot/0.1".

En wikis de Wikimedia, si no proporciona un User-Agent encabezado, o si proporciona uno vacío o genérico, su solicitud fallará con un error HTTP 403. Consulte nuestra política de agente de usuario ".

+0

Por lo tanto, estoy apostando a que su prueba inicial en los otros nombres se hizo con un navegador, y está viendo resultados en caché para esos. Cuando presionas "Steve_Jobs", no está almacenado en la memoria caché, y como no estabas utilizando una cadena UA, obtuviste el 403. –

+0

Puedo reproducirlo de forma consistente con curl. La página de Trabajos devuelve 403 w/o UA. Si se proporciona un UA, entonces devuelve una respuesta 200 normal. Probé algunas otras páginas y ninguna tenía este comportamiento. Extraño... – alienhard

Cuestiones relacionadas