2012-11-20 8 views
8

Ciò che intendo è, se vado a "www.yahoo.com/thispage", e yahoo ha impostato un filtro per reindirizzare/thispage su/thatpage. Quindi, ogni volta che qualcuno va su/thispage, si atterra su/thatpage.Quando uso le richieste python per controllare un sito, se il sito mi reindirizza a un'altra pagina, lo saprò?

Se utilizzo httplib/requests/urllib, saprà che c'è stato un reindirizzamento? Quali pagine di errore? Alcuni siti reindirizzano l'utente su/errorpage ogni volta che non è possibile trovare la pagina.

+2

Qual è il problema che stai cercando di risolvere? In che modo il tuo codice non sta facendo la cosa giusta? Se vuoi semplicemente conoscere le modalità di errore, prova tu stesso questo comportamento. – Marcin

+1

Controlla http://stackoverflow.com/questions/554446/how-do-i-preth-pythons-urllib2-from-following-a-redirect – OneOfOne

+0

@Marcin Ho una lista enorme (1k +) di URL per testare se essi sono in su o no. Ho scelto a caso 40-50 di loro per testare manualmente, vedo che alcuni vengono reindirizzati a una pagina di errore ogni volta che non è possibile trovare una pagina. Inoltre vedo che molti URL sono stati reindirizzati anche perché il pattern URL è cambiato, gli stessi nomi sono stati scritti in modo diverso. – iCodeLikeImDrunk

risposta

13

Con requests, si ottiene un elenco di tutti i reindirizzamenti nell'attributo .history dell'oggetto risposta. Restituisce una lista Python. Vedere lo documentation per ulteriori informazioni.

1

Dipende da come stanno facendo il reindirizzamento. Il modo "giusto" è di restituire un codice di stato HTTP reindirizzato (301/302/303). Il modo "sbagliato" è inserire un meta tag di aggiornamento nel codice HTML.

Se lo fanno, requests lo gestirà in modo trasparente. Tieni presente che qualsiasi reindirizzamento della pagina di errore ragionevole avrà ancora un codice di stato di errore (ad esempio 404) che puoi controllare come response.status_code.

9

Per evitare che le richieste da utilizzare seguenti redirect:

r = requests.get('http://www.yahoo.com/thispage', allow_redirects=False)

Se è in effetti un redirect, è possibile controllare il percorso di destinazione di reindirizzamento in r.headers [ 'location'].

1

La risposta accettata è la prima opzione corretta, ma in alcuni casi se il sito reindirizza con un metatag ha anche un collegamento canonico specificato una volta reindirizzati. In questo esempio, provami a richiedere http://en.wikipedia.org/wiki/Google_Inc_Class_A da wikipedia, che è un URL che reindirizza.

>> request = requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A') 

verifico e:

>> request.history 
[] 

Un'alternativa è quella di cercare di tirare l'url canonica che spera, dovrebbe avere quello che stai stato reindirizzato a. (Nota sto usando BeautifulSoup anche qui)

>> soup = BeautifulSoup(request._content) 
>> canonical = soup.find('link', {'rel': 'canonical'}) 
>> canonical['href'] 
'http://en.wikipedia.org/wiki/Google' 

Il che non corrisponde l'URL reindirizzati in questo caso particolare. Quindi, per essere chiari, questa è una brutta seconda opzione, ma vale la pena provare se tutto il resto fallisce.

+0

Per i futuri lettori: ho appena controllato questo esempio e la cronologia è correttamente compilata: 'requests.get ('http://en.wikipedia.org/wiki/Google_Inc_Class_A', allow_redirects = True)'. Non so se è dovuto ai parametri "allow_redirects" o ad una nuova versione del pacchetto di richieste. – boh

Problemi correlati