2009-03-01 26 views
17

Si consideri il seguente codice Python:Perché la Ricerca Google restituisce l'errore HTTP 403?

 
30 url = "http://www.google.com/search?hl=en&safe=off&q=Monkey" 
31 url_object = urllib.request.urlopen(url); 
32 print(url_object.read()); 

Quando questo viene eseguito, viene generata un'eccezione:

File "/usr/local/lib/python3.0/urllib/request.py", line 485, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 403: Forbidden 

Tuttavia, quando questa viene messa in un browser, i rendimenti di ricerca come previsto. Cosa sta succedendo qui? Come posso superare questo, quindi posso cercare Google a livello di programmazione?

Qualche idea?

risposta

24

Se si desidera eseguire correttamente ricerche di Google tramite un'interfaccia di programmazione, dare un'occhiata a Google APIs. Non solo questi sono il modo ufficiale di cercare su Google, ma è anche improbabile che cambino se Google cambia il layout della pagina dei risultati.

+1

Hai idea di cosa sta succedendo sotto il cofano? Sono curioso ... perché url.read() non sembra un browser standard letto? – AgentLiquid

+4

che tipo di deficiente voterebbe questo post "offensivo"? –

+2

Invece di passare attraverso le interfacce Web, queste API accedono direttamente all'XML di ricerca. Si connettono a una pagina diversa su Google, che fornisce dati in un formato diverso. Fondamentalmente, stavi ottenendo 403 perché non ti era consentito accedere ai dati come eri e Google lo sapeva (...) –

0

Lo stai facendo troppo spesso. Google ha dei limiti per evitare di essere sommersi dai bot di ricerca. Puoi anche provare a impostare lo user-agent su qualcosa che assomigli più a un normale browser.

+0

Ho provato solo due volte oggi. – AgentLiquid

+1

Risposta sbagliata. Blocca al primo tentativo. – nosklo

+1

che è giusto user-agent fa la differenza. – Evgeny

22

questo dovrebbe fare il trucco

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7' 

url = "http://www.google.com/search?hl=en&safe=off&q=Monkey" 
headers={'User-Agent':user_agent,} 

request=urllib2.Request(url,None,headers) //The assembled request 
response = urllib2.urlopen(request) 
data = response.read() // The data u need 
+0

Potresti per favore formattare il tuo codice? (Basta selezionarlo e premere ctrl-k.) – Stephan202

+0

+1 Funziona perfettamente. Tuttavia, se richiedi troppo spesso l'API di google, bloccherà le tue richieste (ad esempio errori di lancio). Ho votato il mio limitato a una volta ogni 3 secondi e non mi sembra di essere più bloccato. – Spike

1

Come lacqui suggested, il Google API's sono il modo in cui vogliono di effettuare richieste da codice. Sfortunatamente, ho trovato che la loro documentazione era indirizzata a persone che scrivevano pagine web AJAX, non facendo richieste HTTP non elaborate. Ho usato LiveHTTP Headers per tracciare le richieste HTTP eseguite dagli esempi, e ho trovato utile ddipaolo's blog post.

Un'altra cosa che mi ha incasinato: ti limitano ai primi 64 risultati da una query. Solitamente non è un problema se stai fornendo agli utenti web una casella di ricerca, ma non è utile se stai cercando di utilizzare Google per eseguire il data mining. Immagino che non vogliano che tu faccia il data mining usando la loro API. Quel 64 numero è cambiato nel tempo e varia tra i prodotti di ricerca.

Aggiornamento: Sembra che non vogliano assolutamente passare al data mining. Alla fine, si ottiene un errore 403 con un collegamento a questo API access notice.

Si prega di rivedere le Condizioni d'uso per le API che si utilizzano (collegate nella barra laterale destra) e garantire la conformità. È probabile che ti abbiamo bloccato per una delle seguenti violazioni dei Termini d'uso: abbiamo ricevuto richieste automatizzate, come scraping e prefetching. Le richieste automatizzate sono proibite; tutte le richieste devono essere fatte come risultato di un'azione dell'utente finale.

Elenca anche altre violazioni, ma penso che sia quello che ha provocato per me. Potrei dover indagare sul servizio BOSS di Yahoo. Non sembra avere tante restrizioni.

Problemi correlati