नैतिक और लागत प्रभावी रूप से स्केलिंग डेटा स्क्रेप्स


13

जीवन में कुछ चीजें मुझे आनंद देती हैं जैसे कि इंटरनेट से संरचित और असंरचित डेटा को स्क्रैप करना और मेरे मॉडलों में इसका उपयोग करना।

उदाहरण के लिए, डेटा साइंस टूलकिट (या RDSTKआर प्रोग्रामर के लिए) मुझे आईपी या पते का उपयोग करके बहुत सारे अच्छे स्थान-आधारित डेटा खींचने की अनुमति देता है और tm.webmining.pluginआर के tmपैकेज के लिए वित्तीय और समाचार डेटा को सीधा कर देता है। जब इस तरह के (सेमी-) संरचित डेटा से परे जा रहा हूं तो मैं उपयोग करना चाहता हूं XPath

हालाँकि, आपको लगातार जितने प्रश्नों की अनुमति दी जा रही है, उन सीमाओं से मैं घिरता जा रहा हूँ। मुझे लगता है कि Google मुझे प्रति घंटे लगभग 50,000 अनुरोधों तक सीमित करता है, जो बिग डेटा के लिए एक समस्या है।

एक से तकनीकी परिप्रेक्ष्य इन सीमाओं के आसपास हो रही आसान है - बस आईपी पतों के लिए स्विच और अपने वातावरण से अन्य पहचानकर्ता शुद्ध। हालांकि, यह नैतिक और वित्तीय चिंताओं (मुझे लगता है?) दोनों को प्रस्तुत करता है।

वहाँ एक समाधान है कि मैं देख रहा हूँ?

जवाबों:


6

कई API के लिए (सबसे मैंने देखा है) ratelimiting आपके API कुंजी या OAuth क्रेडेंशियल्स का एक फ़ंक्शन है। (Google, Twitter, NOAA, Yahoo, Facebook, आदि) अच्छी खबर यह है कि आपको अपने आईपी को खराब करने की आवश्यकता नहीं होगी, आपको बस क्रेडेंशियल्स स्वैप करने की आवश्यकता है क्योंकि वे वहां दर सीमा पर पहुंचते हैं।

यहाँ थोड़ा बेशर्म आत्म प्रचार है लेकिन मैंने इस समस्या से निपटने के लिए विशेष रूप से एक अजगर पैकेज लिखा है।

https://github.com/rawkintrevo/angemilner

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

इसके लिए एक मोंगोडब डेमॉन की आवश्यकता होती है और मूल रूप से आप अपनी प्रत्येक कुंजी के लिए एक पृष्ठ बनाते हैं। इसलिए आपके पास अलग-अलग कुंजी असाइन किए गए प्रत्येक के साथ 4 ईमेल पते हैं। जब आप कुंजी को लोड करते हैं तो आप प्रति दिन अधिकतम कॉल और उपयोग के बीच न्यूनतम समय निर्दिष्ट करते हैं।

लोड कुंजी:

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)

तब जब आप 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'})

हो जाता है:

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_keyवह कुंजी लौटाता है जिसमें कम से कम उपयोग होता है और तब तक इंतजार करता है जब तक कि पर्याप्त समय फिर से उपयोग करने के लिए समाप्त न हो जाए।

अंत में यह देखने के लिए कि आपकी कुंजियों का उपयोग कितनी बार किया गया है / शेष उपलब्ध उपलब्ध हैं:

pprint(l.summary())

मैंने इसे R के लिए नहीं लिखा क्योंकि ज्यादातर स्क्रैपिंग अजगर (MY स्क्रैपिंग में से अधिकांश) में की जाती है। इसे आसानी से पोर्ट किया जा सकता था।

Thats आप तकनीकी रूप से कैसे रेट लिमिटिंग के आसपास हो सकते हैं । नैतिक रूप से ...

अद्यतन उदाहरण यहाँ Google स्थल एपीआई का उपयोग करता है


0

मुझे आईपी एड्रेस ब्लॉक के आसपास एक शानदार तरीका मिल गया है अमेज़ॅन एडब्ल्यूएस (या एज़्योर या किसी अन्य समान ऑन-डिमांड सेवा)। AWS का एक t2.nano उदाहरण लगभग एक उच्च गुणवत्ता वाले प्रॉक्सी के समान है और रेट-सीमित अनुरोधों को ठीक करने में सक्षम से अधिक है।

उदाहरण के लिए, मान लें कि आपको 100,000 पृष्ठों को परिमार्जन करने की आवश्यकता है। AWS सीएलआई का उपयोग करते हुए, आपका प्रोग्राम स्वचालित रूप से 1,000 इंस्टेंस शुरू कर सकता है। यहां तक ​​कि अगर आपको अनुरोधों के बीच 2 सेकंड प्रतीक्षा करने की आवश्यकता है, तो भी आपको 200 सेकंड में किया जाएगा। और आप इसके लिए कितना भुगतान करते हैं?

अभी, AWS के ओहियो क्षेत्र में एक t2.nano उदाहरण के लिए मूल्य $ 0.0058 प्रति घंटा है। एक हजार उदाहरणों के लिए, यह केवल $ 5.8 प्रति घंटा है। लेकिन आपको पूरे घंटे की आवश्यकता नहीं है। आपकी 100,000 पृष्ठों की नौकरी 200 सेकंड से कम समय में समाप्त हो गई थी। स्क्रिप्ट सेट करने, आवश्यक पैकेज स्थापित करने, परिणामों को ज़िप करने और उन्हें अपने सर्वर / पीसी पर डाउनलोड करने के लिए कुछ अतिरिक्त समय जोड़ें और आप अभी भी प्रति उदाहरण सर्वर समय के 10 मिनट में उपयोग करते हैं।

या लगभग एक डॉलर। एक डॉलर के लिए 200 सेकंड में 100,000 पृष्ठ। बुरा नहीं।

नोट: इस तरह से स्केलिंग करते समय, आपको गलती से स्क्रैपिंग लक्ष्य को ओवरलोड करने के बारे में बहुत सावधान रहना होगा। यदि आप किसी एकल वेबसाइट पर इस अधिक मारक क्षमता को हटाते हैं, तो यह लगभग 1,000 अनुरोधों को सर्वर को हर दूसरे सेकंड में मारता है। अधिकांश webservers को मारने के लिए पर्याप्त है। इसलिए जब 1,000 सर्वर विकल्प एक अच्छा विचार हो सकता है यदि आपके पास साइटों की एक विविध सूची है, तो संभवतः आपको एक ही साइट को हिट करने पर अधिकतम 10-20 सर्वर का उपयोग करने की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.