api - वेबसाइट से डेटा स्क्रैप करने का सबसे अच्छा तरीका क्या है?




web-scraping screen-scraping (3)

हाँ आप इसे स्वयं कर सकते हैं। यह पृष्ठ के स्रोतों को पकड़ने और उन्हें जिस तरह से आप चाहते हैं उसे पार्स करने का मामला है।

विभिन्न संभावनाएं हैं। एक अच्छा कॉम्बो python-requests का उपयोग कर रहा है (urllib2 के शीर्ष पर बनाया गया है, यह urllib.request में urllib.request है) और BeautifulSoup4 , जिसमें तत्वों का चयन करने के लिए इसके तरीके हैं और सीएसएस चयनकर्ताओं को भी अनुमति देता है:

import requests
from BeautifulSoup4 import BeautifulSoup as bs
request = requests.get("http://foo.bar")
soup = bs(request.text) 
some_elements = soup.find_all("div", class_="myCssClass")

कुछ xpath पार्सिंग या jquery-like pyquery, lxml या कुछ और पसंद करेंगे।

जब आप चाहते हैं कि डेटा कुछ जावास्क्रिप्ट द्वारा उत्पादित किया गया है, तो उपर्युक्त काम नहीं करेगा। आपको या तो अजगर-भूत या सेलेनियम की आवश्यकता है। मैं बाद वाले को फ़ैंटॉमजेएस के साथ संयुक्त करता हूं , स्थापित करने के लिए बहुत हल्का और सरल, और उपयोग करने में आसान:

from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)

मैं अपना खुद का समाधान शुरू करने की सलाह दूंगा। आप ऐसा कर रहे स्केपर के लाभों को समझेंगे।

ps: स्क्रैपली पर एक नज़र डालें: https://github.com/scrapy/scrapely

पीपीएस: प्रोग्रामिंग ज्ञान के बिना दृष्टि से जानकारी निकालने शुरू करने के लिए पोर्टिया पर एक नज़र डालें: https://github.com/scrapinghub/portia

मुझे किसी वेबसाइट से सामग्रियों को निकालने की आवश्यकता है, लेकिन एप्लिकेशन प्रोग्रामिंग रूप से उस डेटा तक पहुंचने के लिए कोई भी एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस या अन्य तंत्र प्रदान नहीं करता है।

मुझे Import.io नामक एक उपयोगी तृतीय-पक्ष टूल Import.io जो वेब पृष्ठों को स्क्रैप करने और डेटा सेट बनाने के लिए क्लिक और कार्यक्षमता प्रदान करता है, केवल एक चीज है कि मैं अपना डेटा स्थानीय रूप से रखना चाहता हूं और मैं किसी सदस्यता योजना की सदस्यता नहीं लेना चाहता ।

इस कंपनी का उपयोग वेब पेजों को स्क्रैप करने और अपने डेटासेट बनाने के लिए किस प्रकार की तकनीक का उपयोग करता है? मैंने पाया कि कुछ वेब स्क्रैपिंग फ्रेमवर्क pjscrape और Scrapy वे ऐसी सुविधा प्रदान कर सकते हैं


आप निश्चित रूप से एक अच्छा वेब स्क्रैपिंग ढांचे के साथ शुरू करना चाहते हैं। बाद में आप यह तय कर सकते हैं कि वे बहुत सीमित हैं और आप पुस्तकालयों के अपने ढेर को एक साथ रख सकते हैं लेकिन बहुत सारे स्क्रैपिंग अनुभव के बिना आपका डिज़ाइन पीजेस्क्रैप या स्केपर से भी बदतर होगा।

नोट: मैं यहां मूल रूप से विस्थापन योग्य शब्दों को क्रॉलिंग और स्क्रैपिंग का उपयोग करता हूं। यह आपके क्वारा प्रश्न के उत्तर के एक प्रति है, यह बहुत लंबा है।

उपकरण

अपने पसंदीदा ब्राउज़र के आधार पर फ़ायरबग या क्रोम देव उपकरण से बहुत परिचित हो जाएं। यह बिल्कुल जरूरी होगा क्योंकि आप जिस साइट को डेटा खींच रहे हैं उसे ब्राउज़ करें और मानचित्र करें कि कौन से यूआरएल में वह डेटा है जिसे आप ढूंढ रहे हैं और कौन से डेटा प्रारूप प्रतिक्रियाएं बनाते हैं।

आपको HTTP के साथ-साथ HTML के अच्छे कामकाजी ज्ञान की आवश्यकता होगी और शायद मध्य प्रॉक्सी सॉफ़्टवेयर में मनुष्य का एक सभ्य टुकड़ा खोजना होगा। आपको HTTP अनुरोधों और प्रतिक्रियाओं का निरीक्षण करने और समझने की आवश्यकता होगी कि कुकीज और सत्र की जानकारी और क्वेरी पैरामीटर कैसे पास किए जा रहे हैं। फिडलर ( http://www.telerik.com/fiddler ) और चार्ल्स प्रॉक्सी ( http://www.charlesproxy.com/ ) लोकप्रिय उपकरण हैं। मैं mitmproxy ( http://mitmproxy.org/ ) का उपयोग करता हूं क्योंकि मैं माउस लड़के की तुलना में एक कीबोर्ड लड़का हूं।

किसी प्रकार का कंसोल / खोल / आरईपीएल प्रकार पर्यावरण जहां आप त्वरित प्रतिक्रिया के साथ कोड के विभिन्न टुकड़ों को आजमा सकते हैं, अमूल्य होगा। इस तरह के इंजीनियरिंग कार्यों को रिवर्स बहुत परीक्षण और त्रुटि है ताकि आप वर्कफ़्लो चाहें जो इसे आसान बनाता है।

भाषा

PHP मूल रूप से बाहर है, यह इस कार्य के लिए उपयुक्त नहीं है और पुस्तकालय / ढांचे का समर्थन इस क्षेत्र में खराब है। पायथन (स्केपर एक महान प्रारंभिक बिंदु है) और क्लोजर / क्लोजरस्क्रिप्ट (अविश्वसनीय रूप से शक्तिशाली और उत्पादक लेकिन एक बड़ी सीखने की वक्र) इस समस्या के लिए महान भाषाएं हैं। चूंकि आप एक नई भाषा नहीं सीखेंगे और आप जावास्क्रिप्ट को पहले ही जानते हैं, मैं निश्चित रूप से जेएस के साथ चिपकने का सुझाव दूंगा। मैंने pjscrape का उपयोग नहीं किया है, लेकिन यह उनके दस्तावेज़ों के त्वरित पढ़ने से काफी अच्छा लगता है। यह अच्छी तरह उपयुक्त है और नीचे वर्णित समस्या का एक उत्कृष्ट समाधान लागू करता है।

नियमित अभिव्यक्तियों पर एक नोट: PARSE HTML पर नियमित अभिव्यक्तियों का उपयोग न करें। बहुत से शुरुआती ऐसा करते हैं क्योंकि वे पहले से ही रेगेक्स से परिचित हैं। यह एक बड़ी गलती है, एचटीएमएल नेविगेट करने के लिए एक्सपैथ या सीएसएस चयनकर्ताओं का उपयोग करें और केवल HTML नोड के अंदर वास्तविक पाठ से डेटा निकालने के लिए नियमित अभिव्यक्तियों का उपयोग करें। यह आपके लिए पहले से ही स्पष्ट हो सकता है, यदि आप इसे आजमाते हैं तो यह स्पष्ट हो जाता है लेकिन बहुत से लोग किसी कारण से इस सड़क पर बहुत समय बर्बाद कर देते हैं। Xpath या css चयनकर्ताओं से डरो मत, वे regexes से सीखने के लिए आसान तरीका हैं और वे इस सटीक समस्या को हल करने के लिए डिजाइन किए गए थे।

जावास्क्रिप्ट-भारी साइटें

पुराने दिनों में आपको बस एक http अनुरोध करना था और HTML प्रतिलिपि पार्स करना था। अब आपको निश्चित रूप से उन साइटों से निपटना होगा जो मानक HTML HTTP अनुरोध / प्रतिक्रियाओं और लक्षित साइट के जावास्क्रिप्ट भाग द्वारा बनाई गई एसिंक्रोनस HTTP कॉल का मिश्रण हैं। यह वह जगह है जहां आपका प्रॉक्सी सॉफ़्टवेयर और फ़ायरबग / देवतोल्स का नेटवर्क टैब बहुत आसान है। इनके जवाब एचटीएमएल हो सकते हैं या वे जेसन हो सकते हैं, दुर्लभ मामलों में वे एक्सएमएल या कुछ और होंगे।

इस समस्या के दो दृष्टिकोण हैं:

निम्न स्तर का दृष्टिकोण:

आप यह पता लगा सकते हैं कि साइट जावास्क्रिप्ट क्या कह रहा है AJAX urls और उन प्रतिक्रियाओं की तरह क्या दिखता है और वही अनुरोध स्वयं करते हैं। तो आप http://example.com/foobar से एचटीएमएल खींच सकते हैं और डेटा के एक टुकड़े निकाल सकते हैं और फिर http://example.com/api/baz?foo=b ... से जेसन प्रतिक्रिया खींचना होगा डेटा का दूसरा टुकड़ा प्राप्त करें। आपको सही कुकीज़ या सत्र पैरामीटर को पारित करने के बारे में पता होना चाहिए। यह बहुत दुर्लभ है, लेकिन कभी-कभी अजाक्स कॉल के लिए कुछ आवश्यक पैरामीटर साइट की जावास्क्रिप्ट में किए गए कुछ पागल गणना का परिणाम होंगे, रिवर्स इंजीनियरिंग यह परेशान हो सकता है।

एम्बेडेड ब्राउज़र दृष्टिकोण:

आपको HTML में कौन सा डेटा है और AJAX कॉल से कौन सा डेटा आता है, यह जानने की आवश्यकता क्यों है? उस सत्र और कुकी डेटा का प्रबंधन? जब आप कोई साइट ब्राउज़ करते हैं, तो ब्राउज़र और साइट जावास्क्रिप्ट ऐसा करने की आवश्यकता नहीं होती है। यह पूरी बात है।

यदि आप पृष्ठ को एक हेडलेस ब्राउज़र इंजन में लोड करते हैं जैसे फ़ैंटोमज यह पृष्ठ लोड करेगा, जावास्क्रिप्ट चलाएगा और आपको बताएगा कि सभी AJAX कॉल कब पूरा हो गए हैं। उपयुक्त डेटा लोड करने के लिए साइट जावास्क्रिप्ट को ट्रिगर करने के लिए आवश्यक क्लिक को ट्रिगर करने के लिए आवश्यक होने पर आप अपनी खुद की जावास्क्रिप्ट इंजेक्ट कर सकते हैं।

अब आपके पास दो विकल्प हैं, इसे समाप्त एचटीएमएल थूकने के लिए प्राप्त करें और इसे पार्स करें या पेज में कुछ जावास्क्रिप्ट इंजेक्ट करें जो आपके पार्सिंग और डेटा स्वरूपण करता है और डेटा को थकाता है (शायद जेसन प्रारूप में)। आप इन दो विकल्पों को स्वतंत्र रूप से भी मिश्रण कर सकते हैं।

कौन सा दृष्टिकोण सबसे अच्छा है?

यह निर्भर करता है, आपको निश्चित रूप से निम्न स्तर के दृष्टिकोण के साथ परिचित और आरामदायक होने की आवश्यकता होगी। एम्बेडेड ब्राउज़र दृष्टिकोण किसी भी चीज़ के लिए काम करता है, इसे कार्यान्वित करना बहुत आसान होगा और गायब होने में कुछ सबसे कठिन समस्याएं बन जाएंगी। यह मशीनरी का एक जटिल टुकड़ा भी है जिसे आपको समझने की आवश्यकता होगी। यह केवल HTTP अनुरोध और प्रतिक्रिया नहीं है, यह अनुरोध है, एम्बेडेड ब्राउज़र प्रतिपादन, साइट जावास्क्रिप्ट, इंजेक्शन जावास्क्रिप्ट, अपना स्वयं का कोड और एम्बेडेड ब्राउज़र प्रक्रिया के साथ 2-तरफा बातचीत।

एम्बेडेड ब्राउज़र रेंडरिंग ओवरहेड की वजह से स्केल पर भी धीमा है लेकिन यह निश्चित रूप से तब तक कोई फर्क नहीं पड़ता जब तक कि आप कई अलग-अलग डोमेन स्क्रैप नहीं कर लेते। आपके अनुरोधों को सीमित करने की आपकी आवश्यकता से एक डोमेन के मामले में प्रतिपादन समय पूरी तरह से नगण्य हो जाएगा।

सीमा सीमित / बॉट व्यवहार

आपको इसके बारे में बहुत अवगत होना चाहिए। आपको अपने लक्षित डोमेन पर उचित दर पर अनुरोध करने की आवश्यकता है। वेबसाइटों को क्रॉल करते समय आपको एक अच्छी तरह से व्यवहार किया गया बॉट लिखना होगा, और इसका मतलब है robots.txt का सम्मान करना और अनुरोध के साथ सर्वर को हथौड़ा नहीं देना। यहां गलतियों या लापरवाही बहुत अनैतिक है क्योंकि इसे सेवा हमले से इनकार किया जा सकता है। स्वीकार्य दर इस बात पर निर्भर करती है कि आप कौन पूछते हैं, 1req / s वह अधिकतम है जो Google क्रॉलर चलता है लेकिन आप Google नहीं हैं और संभवतः आप Google के रूप में स्वागत नहीं करते हैं। इसे उचित के रूप में धीमा रखें। मैं प्रत्येक पृष्ठ अनुरोध के बीच 2-5 सेकंड का सुझाव दूंगा।

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

यदि साइट आपको अवरुद्ध करना चाहती है तो आपको ब्लॉक करना आसान होगा। उनके अंत में एक स्मार्ट इंजीनियर आसानी से बॉट्स की पहचान कर सकता है और उनके अंत में कुछ मिनटों का काम आपके अंत में आपके स्क्रैपिंग कोड को बदलने के सप्ताहों का कारण बन सकता है या बस इसे असंभव बना सकता है। यदि रिश्ते विरोधी है तो लक्ष्य साइट पर एक स्मार्ट इंजीनियर पूरी तरह से एक प्रतिद्वंद्वी इंजीनियर को क्रॉलर लिख सकता है। स्क्रैपिंग कोड स्वाभाविक रूप से नाजुक है और इसका आसानी से शोषण किया जाता है। कुछ ऐसा जो इस प्रतिक्रिया को उकसाएगा वैसे भी निश्चित रूप से अनैतिक है, इसलिए एक अच्छी तरह से व्यवहार किया गया बॉट लिखें और इसके बारे में चिंता न करें।

परिक्षण

एक इकाई / एकीकरण परीक्षण व्यक्ति नहीं है? बहुत बुरा। अब आपको एक बनना होगा। साइटें अक्सर बदलती हैं और आप अक्सर अपना कोड बदल देंगे। यह चुनौती का एक बड़ा हिस्सा है।

आधुनिक वेबसाइट को स्क्रैप करने में बहुत सारे चलने वाले भाग शामिल हैं, अच्छे परीक्षण अभ्यास बहुत मदद करेंगे। इस प्रकार के कोड लिखते समय आपको कई बग मिलेगी, वह प्रकार होगा जो चुपचाप दूषित डेटा को वापस कर देगा। रिग्रेशन की जांच के लिए अच्छे परीक्षण किए बिना आपको पता चल जाएगा कि आप बिना किसी ध्यान के अपने डेटाबेस में बेकार दूषित डेटा सहेज रहे हैं। यह प्रोजेक्ट आपको डेटा सत्यापन (उपयोग करने के लिए कुछ अच्छी लाइब्रेरी ढूंढें) और परीक्षण से बहुत परिचित कर देगा। ऐसी कई अन्य समस्याएं नहीं हैं जो व्यापक परीक्षणों की आवश्यकता होती है और परीक्षण करने में बहुत मुश्किल होती हैं।

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

आप यह भी जानना चाहते हैं कि साइट बदल गई है या नहीं। अगर उन्होंने साइट को फिर से डिजाइन किया है और आपका क्रॉलर टूटा हुआ है तो आपके यूनिट परीक्षण अभी भी पास हो जाएंगे क्योंकि वे कैश की गई प्रतिलिपि के खिलाफ चल रहे हैं! आपको किसी अन्य, एकीकरण परीक्षण के छोटे सेट की आवश्यकता होगी जो लाइव साइट के खिलाफ लगातार चलती है या आपके क्रॉलिंग कोड में त्रुटि लॉगिंग और सटीक समस्याओं को लॉग करने में त्रुटि का पता लगाने, आपको समस्या के बारे में चेतावनी देता है और क्रॉलिंग रोकता है। अब आप अपना कैश अपडेट कर सकते हैं, अपने यूनिट परीक्षण चला सकते हैं और देख सकते हैं कि आपको क्या बदलना है।

कानूनी मुद्दे

यदि आप बेवकूफ चीजें करते हैं तो यहां कानून थोड़ा खतरनाक हो सकता है। यदि कानून शामिल हो जाता है तो आप उन लोगों से निपट रहे हैं जो नियमित रूप से "हैकिंग टूल्स" के रूप में wget और curl को संदर्भित करते हैं। आप यह नहीं चाहते हैं।

स्थिति की नैतिक वास्तविकता यह है कि यूआरएल का अनुरोध करने और कुछ डेटा देखने और यूआरएल का अनुरोध करने और कुछ डेटा देखने के लिए अपने सॉफ्टवेयर का उपयोग करने के लिए ब्राउजर सॉफ़्टवेयर का उपयोग करने में कोई अंतर नहीं है। Google दुनिया की सबसे बड़ी स्क्रैपिंग कंपनी है और वे इसके लिए प्यार करते हैं। उपयोगकर्ता एजेंट में अपने बॉट्स नाम की पहचान करना और अपने वेब क्रॉलर के लक्ष्यों और इरादों के बारे में खुला होना यहां सहायता करेगा क्योंकि कानून समझता है कि Google क्या है। यदि आप नकली उपयोगकर्ता खाते बनाने या साइट के उन क्षेत्रों तक पहुंचने जैसे कुछ भी छायादार कर रहे हैं, जो आपको नहीं करना चाहिए (या तो robots.txt द्वारा या "किसी प्रकार के प्राधिकरण शोषण के कारण" अवरुद्ध ") तो ध्यान रखें कि आप कुछ अनैतिक कर रहे हैं और प्रौद्योगिकी की कानून की अज्ञानता यहां असाधारण रूप से खतरनाक होगी। यह एक हास्यास्पद स्थिति है लेकिन यह एक वास्तविक है।

एक उदार नागरिक के रूप में ऊपर और ऊपर एक नया खोज इंजन बनाने और बनाने के लिए सचमुच संभव है, गलती करें या अपने सॉफ़्टवेयर में एक बग रखें और हैकर के रूप में देखा जाए। वर्तमान राजनीतिक वास्तविकता पर विचार नहीं करना चाहते हैं।

वैसे भी मैं पाठ की इस विशाल दीवार को लिखने के लिए कौन हूं?

मैंने अपने जीवन में बहुत सारे वेब क्रॉलिंग कोड लिखे हैं। मैं परामर्शदाता, कर्मचारी और स्टार्टअप संस्थापक के रूप में एक दशक से अधिक समय के लिए वेब से संबंधित सॉफ्टवेयर विकास कर रहा हूं। शुरुआती दिनों में पर्ल क्रॉलर / स्क्रैपर्स और PHP वेबसाइटें लिख रही थीं। जब हम जेएस जेम्स गेटेट ने एजेक्स नाम से पहले AJA करने के लिए वेबपृष्ठों में सीएसवी डेटा लोड करने वाले छुपे हुए आइफ्रेम एम्बेड किए थे, तो XMLHTTPRequest एक विचार था। जेसन से पहले, jQuery से पहले। मैं अपने मध्य 30 के दशक में हूं, जिसे जाहिर तौर पर इस व्यवसाय के लिए प्राचीन माना जाता है।

मैंने एक बार मीडिया कंपनी (पर्ल में) में एक बड़ी टीम के लिए और हाल ही में एक छोटी सी टीम के लिए एक खोज इंजन स्टार्टअप (पायथन / जावास्क्रिप्ट में) के सीटीओ के रूप में एक बड़ी टीम के लिए बड़े पैमाने पर क्रॉलिंग / स्क्रैपिंग सिस्टम लिखे हैं। मैं वर्तमान में सलाहकार के रूप में काम करता हूं, जो ज्यादातर क्लोजर / क्लोजरस्क्रिप्ट में कोडिंग करता है (सामान्य रूप से एक अद्भुत विशेषज्ञ भाषा और पुस्तकालयों में क्रॉलर / स्क्रैपर की समस्याएं प्रसन्न होती हैं)

मैंने सफल एंटी-क्रॉलिंग सॉफ्टवेयर सिस्टम भी लिखे हैं। यदि आप उन बॉट्स को पहचानना और छेड़छाड़ करना चाहते हैं, जिन्हें आप पसंद नहीं करते हैं तो उन्हें अवांछित साइटों को लिखना उल्लेखनीय रूप से आसान है।

मुझे किसी अन्य प्रकार के सॉफ़्टवेयर की तुलना में क्रॉलर, स्क्रैपर्स और पार्सर्स लिखना पसंद है। यह चुनौतीपूर्ण, मजेदार है और अद्भुत चीजों को बनाने के लिए इस्तेमाल किया जा सकता है।


since_id और max_id दोनों बहुत ही सरल पैरामीटर हैं जिनका उपयोग आप API से वापस प्राप्त करने के लिए सीमित कर सकते हैं। दस्तावेज़ों से :

since_id - निर्दिष्ट आईडी से अधिक आईडी (यानी, अधिक हालिया) से अधिक आईडी के साथ परिणाम देता है। एपीआई के माध्यम से ट्वीट की संख्या की सीमाएं हैं जिन्हें एक्सेस किया जा सकता है। अगर since_id के बाद ट्वीट्स की सीमा आई है, तो as_id को सबसे पुरानी आईडी के लिए मजबूर किया जाएगा। max_id - निर्दिष्ट आईडी के बराबर या उससे कम आईडी के साथ परिणाम देता है (यानी पुराना है)।

इसलिए, यदि आपके पास एक दी गई ट्वीट आईडी है, तो आप इन दो पैरामीटर का उपयोग करके पुरानी या नई ट्वीट्स खोज सकते हैं।

count भी सरल है - यह 200 तक तक की अधिकतम संख्या में ट्वीट्स को वापस लेना चाहता है।

दुर्भाग्यवश एपीआई आपको वही चीज़ वापस नहीं देगा जो आप चाहते हैं - आप user_timeline पूछताछ करते समय दिनांक / समय निर्दिष्ट नहीं कर सकते - हालांकि आप खोज एपीआई का उपयोग करते समय एक निर्दिष्ट कर सकते हैं। वैसे भी, यदि आपको user_timeline का उपयोग करने की आवश्यकता है, तो आपको एपीआई को मतदान करने, ट्वीट्स एकत्र करने, यह पता लगाने की आवश्यकता होगी कि वे आपके इच्छित पैरामीटर से मेल खाते हैं, और फिर तदनुसार अपने आंकड़ों की गणना करते हैं।





api web-scraping screen-scraping