2012-06-07 9 views
8

stavo attraversando le esercitazioni di Ruby offerti da http://ruby.bastardsbook.com/ e ho incontrato il seguente codice:`open_http ': 403 Forbidden (OpenURI :: HTTPError) la stringa 'Steve_Jobs', ma non per qualsiasi altra stringa

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 

il codice non riesce con il seguente traccia:

/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 

il mio problema non è che il codice non riesce, ma che ogni volta che cambia r2 a qualcosa di diverso da Steve_Jobs, funziona. Cosa sta succedendo qui?

+0

Hai una proxy o qualcosa che potrebbe essere gli URL di filtraggio? Hai provato a utilizzare l'URL "cattivo" tramite qualcos'altro sulla stessa macchina, ad es. il browser lynx? –

+0

Nulla in quanto tale. Funziona anche con un wget "http://en.wikipedia.org/wiki/Steve_Jobs". Sono stupito. –

+1

Puoi provare a impostare l'user-agent come 'open (remote_full_url," User-Agent "=>" Mozilla/5.0 (Windows NT 6.0; rv: 12.0) Gecko/20100101 Firefox/12.0 FirePHP/0.7.1 ")' su il vostro lato? – vstm

risposta

2

penso che questo accade per le voci bloccate giù come "Steve Jobs", "Al-Gore", ecc Questo è specificato nello stesso libro che ci si riferisce a:

Per alcune pagine - come ad esempio La voce bloccata di Al Gore - Wikipedia sarà non rispondere a una richiesta web se non è specificato un User-Agent. L''agente utente' si riferisce in genere al browser e questo è possibile vedere da ispezionando le intestazioni inviate per qualsiasi richiesta di pagina nel browser. Fornendo una coppia chiave-valore "User-Agent", (fondamentalmente uso "Ruby" e sembra funzionare), possiamo passarlo come hash (io uso la costante HEADERS_HASH nell'esempio) come seconda argomento della chiamata del metodo .

Si precisa poi a http://ruby.bastardsbook.com/chapters/web-crawling/

9

Il codice funziona correttamente (Ruby MRI 1.9.3) quando richiedo una pagina wiki esistente.

Quando richiedo una pagina wiki che NON esiste, ottengo un codice di errore 404 mediawiki.

  • Steve_Jobs => successo
  • Steve_Austin => successo
  • Steve_Rogers => successo
  • Steve_Foo => errore

Wikipedia fa un tonnellata di caching, quindi se vedete ripensa a "Steve_Jobs" che sono diversi da quelli che esistono, quindi suppongo che questo sia dovuto al fatto che wikipedia caching l'articolo di Steve Jobs perché è famoso e potenzialmente ad ulteriori verifiche/verifiche per proteggere l'articolo da rapide modifiche, defacings, ecc.

La soluzione per voi: aprire sempre l'url con una stringa User Agent.

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

dettagli dalla documentazione MediaWiki: "Quando si fanno le richieste HTTP al servizio Web API MediaWiki, assicurati di specificare un'intestazione User-Agent che identifica correttamente il cliente non utilizzare il default User-Agent. fornito dalla libreria del client, ma crea un'intestazione personalizzata che include il nome e il numero di versione del client: qualcosa come "MyCuteBot/0.1".

Su Wikimedia wiki, se non si fornisce un utente-agente header, o ne fornisci uno vuoto o generico, la tua richiesta fallirà con un errore HTTP 403. Vedi la nostra politica User-Agent. "

+0

Quindi, sto scommettendo che il test iniziale sugli altri nomi è stato fatto con un browser, e per quelli si vedranno risultati memorizzati nella cache. Quando si preme "Steve_Jobs", non è memorizzato nella cache, e dal momento che non si stava usando una stringa UA, si ottiene il 403. –

+0

Posso riprodurlo costantemente con arricciatura. La pagina Lavori restituisce 403 senza UA. Se viene fornito un UA, restituisce una normale risposta 200. Ho provato qualche altra pagina e nessuno ha avuto questo comportamento. Strano... – alienhard

Problemi correlati