Escalada de dados de forma ética e econômica

13

Poucas coisas na vida me dão prazer, como coletar dados estruturados e não estruturados da Internet e utilizá-los em meus modelos.

Por exemplo, a Ciência Toolkit de dados (ou RDSTKpara programadores R) permite-me para puxar lotes de bons baseados em localização de dados usando IP de ou endereços de e tm.webmining.pluginpara de R tmpacote faz raspagem straightfoward de dados financeiros e notícias. Ao ir além desses dados (semi) estruturados, costumo usar XPath.

No entanto, estou constantemente sendo afetado por limites no número de consultas que você pode fazer. Acho que o Google me limita a cerca de 50.000 solicitações por 24 horas, o que é um problema para o Big Data.

De uma perspectiva técnica , é fácil contornar esses limites - basta alternar os endereços IP e remover outros identificadores do seu ambiente. No entanto, isso apresenta preocupações éticas e financeiras (eu acho?).

Existe uma solução que estou ignorando?

Hack-R
fonte

Respostas:

6

Para muitas APIs (a maioria das que já vi), a limitação de rateamento é uma função das suas credenciais de chave de API ou OAuth. (Google, Twitter, NOAA, Yahoo, Facebook, etc.) A boa notícia é que você não precisará falsificar seu IP, basta trocar as credenciais, pois elas atingem o limite de taxa.

Um pouco de autopromoção vergonhosa aqui, mas escrevi um pacote python especificamente para lidar com esse problema.

https://github.com/rawkintrevo/angemilner

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

Requer um daemon mongodb e, basicamente, você cria uma página para cada uma de suas chaves. Então você tem 4 endereços de e-mail, cada um com uma chave separada atribuída. Ao carregar a chave, você especifica o máximo de chamadas por dia e o tempo mínimo entre os usos.

Carregar chaves:

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)

Então, quando você executa o seu raspador, por exemplo, a API do 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'})

torna-se:

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']})

portanto, se você tiver 5 chaves, l.check_out_api_keyretornará a chave que menos utiliza e aguarda o tempo suficiente para que ela seja usada novamente.

Por fim, para ver com que frequência suas chaves foram usadas / uso restante disponível:

pprint(l.summary())

Eu não escrevi isso para R, porque a maioria das raspagens é feita em python (a maioria das minhas raspagens). Pode ser facilmente portado.

É assim que você pode tecnicamente contornar a limitação de taxa. Eticamente ...

ATUALIZAÇÃO O exemplo usa a API do Google Places aqui

rawkintrevo
fonte
0

Encontrei uma maneira fantástica de contornar os blocos de endereços IP é o Amazon AWS (ou o Azure ou qualquer outro serviço sob demanda semelhante). Uma instância t2.nano da AWS custa quase o mesmo que um proxy de alta qualidade e é mais do que capaz de lidar com solicitações com taxa limitada.

Por exemplo, digamos que você precise raspar 100.000 páginas. Usando a CLI da AWS, seu programa pode iniciar automaticamente 1.000 instâncias. Mesmo se você precisar esperar 2 segundos entre as solicitações, ainda assim será concluído em 200 segundos. E quanto você paga por isso?

No momento, o preço de uma instância t2.nano é de US $ 0,0058 por hora na região da AWS em Ohio. Para mil casos, são apenas US $ 5,8 por hora. Mas você não precisa de uma hora inteira. Seu trabalho de 100.000 páginas foi concluído em menos de 200 segundos. Adicione um tempo extra para configurar o script, instalar os pacotes necessários, compactar os resultados e baixá-los no seu servidor / pc e você ainda utilizará no máximo 10 minutos de tempo do servidor por instância.

Ou cerca de um dólar. 100.000 páginas em 200 segundos por um dólar. Não é ruim.

Nota: Ao dimensionar dessa maneira, você deve ter muito cuidado para não sobrecarregar acidentalmente o alvo de raspagem. Se você libera tanto poder de fogo em um único site, são cerca de 1.000 solicitações atingindo o servidor a cada segundo alternado. O suficiente para matar a maioria dos servidores da web. Portanto, embora a opção 1.000 servidores possa ser uma boa idéia se você tiver uma lista diversificada de sites, provavelmente precisará usar de 10 a 20 servidores no máximo se estiver acessando um único site.

Aayush Agrawal
fonte