2009-03-01 24 views
17

Consideremos el siguiente código Python:¿Por qué Google Search devuelve HTTP Error 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()); 

Cuando esto se ejecuta, se produce una excepción:

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 

Sin embargo, cuando esto se pone en un navegador, los retornos de búsqueda como se esperaba. ¿Que está pasando aqui? ¿Cómo puedo superar esto para poder buscar Google programáticamente?

¿Alguna idea?

Respuesta

24

Si desea realizar búsquedas en Google "correctamente" a través de una interfaz de programación, eche un vistazo a Google APIs. No solo son la forma oficial de buscar en Google, sino que tampoco es probable que cambien si Google cambia el diseño de la página de resultados.

+1

¿Tienes idea de lo que sucede debajo del capó? Tengo curiosidad ... ¿por qué url.read() no parece una lectura de navegador estándar? – AgentLiquid

+4

¿qué clase de imbécil votaría esta publicación como "ofensiva"? –

+2

En lugar de ir a través de las interfaces web, estas API acceden directamente al XML de búsqueda. Se conectan a una página diferente en Google, que le brinda datos en un formato diferente. Básicamente, recibía 403 porque no se le permitía acceder a los datos de la manera en que usted era, y Google lo sabía (...) –

0

Lo haces con demasiada frecuencia. Google tiene límites establecidos para evitar que los bots de búsqueda lo inunden. También puede intentar configurar el agente de usuario para que se asemeje más a un navegador normal.

+0

Solo he intentado dos veces hoy. – AgentLiquid

+1

Respuesta incorrecta. Bloquea en el primer intento. – nosklo

+1

el agente de usuario correcto hace toda la diferencia. – Evgeny

22

esto debe hacer el truco

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

¿Podría formatear su código? (Simplemente selecciónelo y presione ctrl-k.) – Stephan202

+0

+1 Esto funciona perfectamente. Sin embargo, si solicita la API de Google con demasiada frecuencia, bloqueará sus solicitudes (es decir, arrojará errores). He limitado el mío a una vez cada 3 segundos y parece que ya no me bloquean. – Spike

1

Como lacqui suggested, la Google API's son como ellos quieren que usted haga las peticiones de código. Desafortunadamente, encontré que su documentación estaba dirigida a personas que escriben páginas web AJAX, sin realizar solicitudes HTTP sin formato. Usé LiveHTTP Headers para rastrear las solicitudes HTTP que hicieron las muestras, y encontré que ddipaolo's blog post me resultó útil.

Una cosa más que me molestó: te limitan a la primeros 64 resultados de una consulta. Por lo general, no es un problema si solo proporciona a los usuarios de la Web un cuadro de búsqueda, pero no es útil si está tratando de usar Google para ir a la minería de datos. Supongo que no quieren que vayas a minería de datos usando su API. Ese número 64 ha cambiado con el tiempo y varía entre los productos de búsqueda.

Actualización: Parece que definitivamente no quieren que vaya a minería de datos. Eventualmente, obtienes un error 403 con un enlace a este API access notice.

Lea los Términos de uso del API (s) que está utilizando (vinculado en la barra lateral a la derecha) y verifique que se cumplan. Es probable que lo bloqueemos por una de las siguientes infracciones de los Términos de uso: recibimos solicitudes automáticas, como raspado y extracción previa. Las solicitudes automatizadas están prohibidas; todas las solicitudes deben realizarse como resultado de una acción del usuario final.

También enumeran otras violaciones, pero creo que esa es la que me provocó. Es posible que tenga que investigar el servicio BOSS de Yahoo. No parece tener tantas restricciones.

Cuestiones relacionadas