Veri Notlarını Etik ve Uygun Maliyetli Ölçekleme


13

Hayattaki birkaç şey bana internetten yapılandırılmış ve yapılandırılmamış verileri kazımak ve modellerimde kullanmaktan zevk veriyor.

Örneğin, Veri Bilimi Araç Seti (veya RDSTKR programcıları için) IP'leri veya adresleri kullanarak çok sayıda iyi konum tabanlı veri çekmeme izin verir ve tm.webmining.pluginfor R tmpaketi, finansal ve haber verilerinin kazınmasını düzensiz hale getirir. Bu tür (yarı) yapılandırılmış verilerin ötesine geçerken kullanmaya eğilimliyim XPath.

Ancak, sürekli olarak, yapmanıza izin verilen sorgu sayısı sınırlarıyla sınırlandırılıyorum. Google'ın beni 24 saatte yaklaşık 50.000 istekle sınırlandırdığını düşünüyorum, bu da Büyük Veri için bir sorundur.

Bir itibaren teknik bu sınırların dolaşmakta perspektiften kolaydır - sadece IP adreslerini değiştirmek ve çevreden diğer tanımlayıcılar tasfiye. Ancak bu hem etik hem de finansal kaygıları ortaya koymaktadır (sanırım?).

Göz ardı ettiğim bir çözüm var mı?

Yanıtlar:


6

Birçok API için (en çok gördüğüm) ratelimiting, API Anahtarınızın veya OAuth kimlik bilgilerinizin bir işlevidir. (Google, Twitter, NOAA, Yahoo, Facebook, vb.) İyi haber şu ki, IP'nizi taklit etmeniz gerekmiyor, sadece oran limitine ulaştıkça kimlik bilgilerinizi değiştirmeniz gerekiyor.

Burada biraz utanmaz öz tanıtım ama özellikle bu sorunu ele almak için bir python paketi yazdım.

https://github.com/rawkintrevo/angemilner

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

Bir mongodb arka plan programı gerektirir ve temel olarak anahtarlarınızın her biri için bir sayfa yaparsınız. Böylece her birine ayrı bir anahtar atanmış 4 e-posta adresiniz vardır. Anahtarı yüklediğinizde, günlük maksimum çağrıları ve kullanımlar arasındaki minimum süreyi belirtirsiniz.

Yükleme anahtarları:

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)

Sonra sıyırıcıyı çalıştırdığınızda örneğin NOAA api:

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

dönüşür:

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

5 l.check_out_api_keyanahtarınız varsa, en az kullanıma sahip anahtarı döndürür ve yeniden kullanılması için yeterli zaman geçene kadar bekler.

Son olarak, anahtarlarınızın ne sıklıkta kullanıldığını / kullanılabilir kalan kullanım süresini görmek için:

pprint(l.summary())

R için yazmadım çünkü çoğu kazıma python'da (çoğu kazıma) yapılır. Kolayca taşınabilir.

Bu, teknik olarak hız sınırlamasını aşabilirsiniz. Etik olarak ...

GÜNCELLEME Örnekte Google Rehber API'sı burada kullanılmıştır


0

IP adres bloklarını aşmanın harika bir yolunu bulduk Amazon AWS (Veya Azure veya benzeri herhangi bir isteğe bağlı hizmet). AWS'den gelen bir t2.nano örneği, yüksek kaliteli bir proxy ile neredeyse aynıdır ve oran sınırlı istekleri iyi işleme kapasitesinden daha fazladır.

Örneğin, 100.000 sayfa kazımanız gerektiğini varsayalım. AWS CLI kullanarak, programınız otomatik olarak 1.000 örneği başlatabilir. İstekler arasında 2 saniye beklemeniz gerekse bile, 200 saniye içinde işleminiz devam eder. Ve bunun için ne kadar ödüyorsun?

Şu anda, t2.nano örneğinin fiyatı AWS'nin Ohio bölgesinde Saat başına 0,0058 $ 'dır. Bin örnek için saatte sadece 5,8 dolar . Ama tüm saate ihtiyacınız yok. 100.000 sayfalık işiniz 200 saniyeden kısa sürede tamamlandı. Komut dosyasını ayarlamak, gerekli paketleri yüklemek, sonuçları sıkıştırmak ve sunucunuza / bilgisayarınıza indirmek için fazladan zaman ekleyin ve yine de örnek başına en fazla 10 dakika sunucu süresi kullandınız.

Ya da yaklaşık bir dolar. Bir dolar için 200 saniyede 100.000 sayfa. Fena değil.

Not: Bu şekilde ölçeklendirirken, kazıyıcı hedefi yanlışlıkla aşırı yüklememeye çok dikkat etmelisiniz. Tek bir web sitesinde bu kadar ateş gücünü serbest bırakırsanız, sunucuya her saniyede bir vurmak yaklaşık 1.000 istektir. Çoğu web sunucusunu öldürmek için yeterli. Bu nedenle, çeşitlendirilmiş bir site listeniz varsa 1.000 sunucu seçeneği iyi bir fikir olabilir, ancak tek bir siteye isabet ediyorsanız muhtemelen en fazla 10-20 sunucu kullanmanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.