2013-07-30 11 views
6

Per qualche motivo ottengo un HTTP Error 403: Forbidden quando provo ad aprire la pagina http://questionablecontent.net. Ho avuto l'errore robots.txt, ma è stato risolto. Inoltre, non riesco nemmeno a trovare il loro file robots.txt.Perché la meccanizzazione genera un errore HTTP 403?

Posso ancora visualizzare la pagina Web da Chrome, quindi quello che mi chiedo è: la meccanizzazione ha un aspetto diverso rispetto a Chrome anche dopo aver impostato le intestazioni appropriate?

Ecco il mio codice (che non funziona):

br = mechanize.Browser() 
cj = cookielib.LWPCookieJar() 
br.set_cookiejar(cj) 
br.set_handle_equiv(True) 
br.set_handle_redirect(True) 
br.set_handle_robots(False) 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 

Ho anche provato a installare i addheaders alle stesse intestazioni come browser (che ho trovato here):

br.addheaders = [('User-agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36')] 

. .. ma non ha funzionato.

Infine, ho provato a utilizzare Selenium e ha funzionato, visto che carica la pagina in chrome e quindi comunica con Python. Tuttavia, mi piacerebbe farlo funzionare con mechanize. Inoltre, non sono ancora sicuro di come chrome e mechanize siano diversi dal loro server.

+0

la tua domanda mi aiuta davvero e ha risolto il mio problema! grazie mille amico – Clement

risposta

4

Il trucco è probabilmente nelle intestazioni delle richieste che il selenio sta inviando, a parte l'intestazione dell'agente utente, alcuni server controllano anche altre intestazioni per assicurarsi che un vero browser stia parlando con loro. un'occhiata ad una delle mie risposte più anziani:

urllib2.HTTPError: HTTP Error 403: Forbidden

Al tuo posto, vorrei provare ad aggiungere tutte le intestazioni tuo browser vero e proprio Chrome invia, e quindi eliminare quelli inutili.

+0

È strano, ho smesso di ottenere l'errore 403 senza cambiare il mio codice. Anche se ho usato questo stesso codice sul loro sito web e funzionava, quindi presumo che qualcosa stia cambiando dalla loro parte. Sono andato e ho aggiunto le intestazioni aggiuntive per ogni evenienza. –

+0

Per chiarezza, se dovessi inviare tutte le intestazioni inviate dal mio browser Chrome vero, sembrerebbe esattamente lo stesso come se il mio browser Chrome inviasse la richiesta? C'è qualcos'altro? –

+0

Se si restituiscono tutti i cookie ricevuti e tutte le intestazioni inviate da un browser reale, appariranno sicuramente uguali. L'unica cosa che può fare la differenza è javascript. Le pagine che sono fortemente basate su ajax spesso eseguono alcune modifiche di dati/cookie sul lato client prima di inviare una richiesta, e potrebbe essere più difficile "decodificare" ed emulare tale comportamento con richieste non elaborate. In questi casi è meglio usare un webdriver, come il selenio, o scriverne uno da zero usando il modulo QtWebKit di PySide/PyQt per esempio. – andrean

Problemi correlati