Escalado de datos de forma ética y rentable

13

Pocas cosas en la vida me dan placer, como extraer datos estructurados y no estructurados de Internet y utilizarlos en mis modelos.

Por ejemplo, el Data Science Toolkit (o RDSTKpara los programadores de R) me permite extraer muchos datos buenos basados ​​en la ubicación utilizando IP o direcciones y el paquete tm.webmining.pluginde R tmhace que el raspado de datos financieros y de noticias sea directo. Cuando voy más allá de tales datos (semi) estructurados, tiendo a usarlos XPath.

Sin embargo, constantemente me limitan los límites en la cantidad de consultas que puede hacer. Creo que Google me limita a unas 50,000 solicitudes por 24 horas, lo cual es un problema para Big Data.

Desde una perspectiva técnica , superar estos límites es fácil: simplemente cambie las direcciones IP y purgue otros identificadores de su entorno. Sin embargo, esto presenta preocupaciones tanto éticas como financieras (¿creo?).

¿Hay una solución que estoy pasando por alto?

Hack-R
fuente

Respuestas:

6

Para muchas API (la mayoría que he visto), la limitación de imagen es una función de sus credenciales API Key u OAuth. (Google, Twitter, NOAA, Yahoo, Facebook, etc.) La buena noticia es que no necesitará falsificar su IP, solo tendrá que cambiar las credenciales cuando alcancen el límite de velocidad.

Un poco de auto promoción descarada aquí, pero escribí un paquete de Python específicamente para manejar este problema.

https://github.com/rawkintrevo/angemilner

https://pypi.python.org/pypi/angemilner/0.2.0

Requiere un demonio mongodb y básicamente haces una página para cada una de tus claves. Entonces tiene 4 direcciones de correo electrónico cada una con una clave separada asignada. Cuando carga la clave, especifica las llamadas máximas por día y el tiempo mínimo entre usos.

Cargar claves:

from angemilner import APIKeyLibrarian
l= APIKeyLibrarian()
l.new_api_key("your_assigned_key1", 'noaa', 1000, .2)
l.new_api_key("your_assigned_key2", 'noaa', 1000, .2)

Luego, cuando ejecuta su raspador, por ejemplo, la API de NOAA:

url= 'http://www.ncdc.noaa.gov/cdo-web/api/v2/stations' 
payload= {  'limit': 1000,
        'datasetid':  'GHCND', 
        'startdate': '1999-01-01' }

r = requests.get(url, params=payload, headers= {'token': 'your_assigned_key'})

se convierte en:

url= 'http://www.ncdc.noaa.gov/cdo-web/api/v2/stations'
payload= {  'limit': 1000,
            'datasetid':  'GHCND',
            'startdate': '1999-01-01' }

r = requests.get(url, params=payload, headers= {'token': l.check_out_api_key('noaa')['key']})

por lo tanto, si tiene 5 claves, l.check_out_api_keydevuelve la clave que tiene menos usos y espera hasta que haya transcurrido el tiempo suficiente para que se pueda volver a utilizar.

Finalmente, para ver con qué frecuencia se han utilizado sus claves / uso restante disponible:

pprint(l.summary())

No escribí esto para R porque la mayoría del raspado se realiza en python (la mayor parte de MI raspado). Podría ser fácilmente portado.

Así es como técnicamente puede evitar la limitación de velocidad. Éticamente ...

ACTUALIZACIÓN El ejemplo utiliza la API de Google Places aquí

rawkintrevo
fuente
0

He descubierto que una forma fantástica de sortear los bloques de direcciones IP es Amazon AWS (o Azure o cualquier otro servicio a pedido similar). Una instancia t2.nano de AWS cuesta casi lo mismo que un proxy de alta calidad y es más que capaz de manejar solicitudes de velocidad limitada.

Por ejemplo, supongamos que necesita raspar 100,000 páginas. Con la AWS CLI, su programa puede iniciar automáticamente 1,000 instancias. Incluso si necesita esperar 2 segundos entre las solicitudes, aún estaría listo en 200 segundos. ¿Y cuánto pagas por ello?

En este momento, el precio de una instancia de t2.nano es de $ 0.0058 por hora en la región de Ohio de AWS. Para mil instancias, eso es solo $ 5.8 por hora. Pero no necesitas toda la hora. Su trabajo de 100,000 páginas se terminó en menos de 200 segundos. Agregue un poco de tiempo extra para configurar el script, instalar los paquetes requeridos, comprimir los resultados y descargarlos a su servidor / PC y aún utiliza como máximo 10 minutos de tiempo de servidor por instancia.

O alrededor de un dólar. 100,000 páginas en 200 segundos por un dólar. No está mal.

Nota: Al escalar así, debe tener mucho cuidado de no sobrecargar accidentalmente el objetivo de raspado. Si liberas tanta potencia de fuego en un solo sitio web, son alrededor de 1,000 solicitudes que llegan al servidor cada segundo alternativo. Suficiente para matar a la mayoría de los servidores web. Entonces, si bien la opción de 1,000 servidores puede ser una buena idea si tiene una lista diversificada de sitios, probablemente necesitará usar 10-20 servidores como máximo si está accediendo a un solo sitio.

Aayush Agrawal
fuente