आप निश्चित रूप से एक अच्छा वेब स्क्रैपिंग फ्रेमवर्क के साथ शुरुआत करना चाहेंगे। बाद में आप यह तय कर सकते हैं कि वे बहुत सीमित हैं और आप पुस्तकालयों के अपने ढेर को एक साथ रख सकते हैं, लेकिन बहुत अधिक स्क्रैपिंग अनुभव के बिना आपका डिज़ाइन pjscrape या स्क्रैपी से बहुत खराब होगा।
नोट: मैं यहाँ मूल रूप से विनिमेय क्रॉलिंग और स्क्रैपिंग शब्दों का उपयोग करता हूँ। यह आपके Quora प्रश्न के उत्तर की एक प्रति है, यह बहुत लंबा है।
उपकरण
अपने पसंदीदा ब्राउज़र के आधार पर फायरबग या क्रोम देव टूल्स से बहुत परिचित हों। यह पूरी तरह से आवश्यक होगा क्योंकि आप उस साइट को ब्राउज़ करते हैं जिसे आप डेटा खींच रहे हैं और मैप करते हैं जिसमें आपके द्वारा खोजा जा रहा डेटा शामिल है और कौन से डेटा प्रारूप प्रतिक्रियाएं बनाते हैं।
आपको एचटीएमएल के साथ-साथ एचटीटीपी के एक अच्छे कामकाजी ज्ञान की आवश्यकता होगी और संभवत: मध्य प्रॉक्सी सॉफ्टवेयर में मनुष्य का एक सभ्य टुकड़ा खोजना चाहेंगे। आपको HTTP अनुरोधों और प्रतिक्रियाओं का निरीक्षण करने और समझने की आवश्यकता होगी कि कुकीज़ और सत्र की जानकारी और क्वेरी पैरामीटर कैसे पास किए जा रहे हैं। Fiddler ( http://www.telerik.com/fiddler ) और चार्ल्स प्रॉक्सी ( http://www.charlesproxy.com/ ) लोकप्रिय उपकरण हैं। मैं mitmproxy ( http://mitmproxy.org/ ) का उपयोग बहुत करता हूं क्योंकि मैं एक माउस लड़के की तुलना में कीबोर्ड आदमी से अधिक हूं।
कुछ प्रकार के कंसोल / शेल / आरईपीएल प्रकार के वातावरण जहां आप तत्काल प्रतिक्रिया के साथ कोड के विभिन्न टुकड़ों को आज़मा सकते हैं, अमूल्य होगा। इस तरह के उल्टे इंजीनियरिंग कार्य बहुत अधिक परीक्षण और त्रुटि के होते हैं, इसलिए आप एक ऐसा वर्कफ़्लो चाहते हैं जो इसे आसान बना दे।
भाषा: हिन्दी
PHP मूल रूप से बाहर है, यह इस कार्य के लिए अच्छी तरह से अनुकूल नहीं है और इस क्षेत्र में लाइब्रेरी / फ्रेमवर्क समर्थन खराब है। पाइथन (स्क्रेपी एक महान प्रारंभिक बिंदु है) और क्लोजर / क्लोजरस्क्रिप्ट (अविश्वसनीय रूप से शक्तिशाली और उत्पादक लेकिन एक बड़ी सीखने की अवस्था) इस समस्या के लिए महान भाषाएं हैं। चूंकि आप एक नई भाषा नहीं सीखेंगे और आप पहले से ही जावास्क्रिप्ट को जानते हैं, मैं निश्चित रूप से जेएस के साथ चिपके रहने का सुझाव दूंगा। मैंने pjscrape का उपयोग नहीं किया है, लेकिन यह उनके डॉक्स के त्वरित पढ़ने से काफी अच्छा लगता है। यह अच्छी तरह से अनुकूल है और नीचे वर्णित समस्या का एक उत्कृष्ट समाधान लागू करता है।
नियमित अभिव्यक्ति पर एक नोट: PARSE HTML के लिए नियमित रूप से पंजीकरण का उपयोग न करें। बहुत से शुरुआती लोग ऐसा करते हैं क्योंकि वे पहले से ही रेगीज़ से परिचित हैं। यह एक बड़ी गलती है, html को नेविगेट करने के लिए xpath या css चयनकर्ताओं का उपयोग करें और केवल एक HTML नोड के अंदर वास्तविक पाठ से डेटा निकालने के लिए नियमित अभिव्यक्ति का उपयोग करें। यह आपके लिए पहले से ही स्पष्ट हो सकता है, अगर आप इसे आजमाते हैं तो यह जल्दी से स्पष्ट हो जाता है लेकिन बहुत से लोग इस सड़क पर किसी कारण से बहुत समय बर्बाद करते हैं। Xpath या css चयनकर्ताओं से डरो मत, वे regexes की तुलना में सीखना आसान हैं और उन्हें इस सटीक समस्या को हल करने के लिए डिज़ाइन किया गया था।
जावास्क्रिप्ट-भारी साइटें
पुराने दिनों में आपको बस एक http अनुरोध करना था और HTML रिपीट को पार्स करना था। अब आपको लगभग उन साइटों से निपटना होगा जो मानक HTML HTTP अनुरोध / प्रतिक्रियाओं का मिश्रण हैं और लक्ष्य साइट के जावास्क्रिप्ट भाग द्वारा किए गए अतुल्यकालिक HTTP कॉल हैं। यह वह जगह है जहाँ आपका प्रॉक्सी सॉफ्टवेयर और फायरबग / डेवटूल का नेटवर्क टैब बहुत काम आता है। इनकी प्रतिक्रियाएं html हो सकती हैं या वे json हो सकती हैं, दुर्लभ मामलों में वे xml या कुछ और होंगी।
इस समस्या के दो दृष्टिकोण हैं:
निम्न स्तर का दृष्टिकोण:
आप यह पता लगा सकते हैं कि अजाक्स साइट जावास्क्रिप्ट को क्या कहता है और उन प्रतिक्रियाओं को कैसा दिखता है और उन्हीं अनुरोधों को स्वयं करता है। तो आप http://example.com/foobar से html को खींच सकते हैं और डेटा का एक टुकड़ा निकाल सकते हैं और फिर http://example.com/api/baz?foo=b से json प्रतिक्रिया खींचनी होगी ... डेटा का दूसरा टुकड़ा प्राप्त करें। आपको सही कुकीज़ या सत्र मापदंडों को पारित करने के बारे में पता होना चाहिए। यह बहुत दुर्लभ है, लेकिन कभी-कभी अजाक्स कॉल के लिए कुछ आवश्यक पैरामीटर साइट की जावास्क्रिप्ट में किए गए कुछ पागल गणना का परिणाम होगा, रिवर्स इंजीनियरिंग यह कष्टप्रद हो सकता है।
एम्बेडेड ब्राउज़र दृष्टिकोण:
आपको यह जानने की आवश्यकता है कि html में कौन सा डेटा है और ajax कॉल से क्या डेटा आता है? उस सत्र और कुकी डेटा को प्रबंधित करना? जब आप किसी साइट को ब्राउज़ करते हैं, तो ब्राउज़र और साइट जावास्क्रिप्ट ऐसा नहीं करते हैं। यह पूरी बात है।
यदि आप पृष्ठ को केवल हेडलेस ब्राउज़र इंजन में लोड करते हैं, जैसे कि यह पृष्ठ लोड करेगा, तो जावास्क्रिप्ट को चलाएगा और आपको बताएगा कि सभी ajax कॉल कब पूरी हो चुकी हैं। आप उपयुक्त क्लिकों को ट्रिगर करने के लिए या जो भी आवश्यक हो, उपयुक्त डेटा को लोड करने के लिए साइट जावास्क्रिप्ट को ट्रिगर करने के लिए अपनी स्वयं की जावास्क्रिप्ट को इंजेक्ट कर सकते हैं।
अब आपके पास दो विकल्प हैं, इसे समाप्त html को थूकने के लिए प्राप्त करें और इसे पार्स करें या पृष्ठ में कुछ जावास्क्रिप्ट को इंजेक्ट करें जो आपके पार्सिंग और डेटा को स्वरूपित करता है और डेटा को बाहर निकालता है (शायद json प्रारूप में)। आप स्वतंत्र रूप से इन दो विकल्पों को भी मिला सकते हैं।
कौन सा दृष्टिकोण सबसे अच्छा है?
यह निर्भर करता है, आपको सुनिश्चित करने के लिए निम्न स्तर के दृष्टिकोण से परिचित और आरामदायक होने की आवश्यकता होगी। एम्बेडेड ब्राउज़र दृष्टिकोण किसी भी चीज के लिए काम करता है, इसे लागू करना बहुत आसान होगा और स्क्रैपिंग गायब होने में कुछ कठिन समस्याएं पैदा करेगा। यह मशीनरी का काफी जटिल टुकड़ा है जिसे आपको समझने की आवश्यकता होगी। यह केवल HTTP अनुरोध और प्रतिक्रियाएं नहीं है, यह अनुरोध है, एम्बेडेड ब्राउज़र रेंडरिंग, साइट जावास्क्रिप्ट, इंजेक्टेड जावास्क्रिप्ट, आपका अपना कोड और एम्बेडेड ब्राउज़र प्रक्रिया के साथ 2-तरफा इंटरैक्शन।
ओवरहेड रेंडरिंग के कारण एम्बेडेड ब्राउज़र भी बहुत धीमा है, लेकिन यह लगभग निश्चित रूप से कोई फर्क नहीं पड़ता जब तक कि आप बहुत सारे अलग-अलग डोमेन को स्क्रैप नहीं कर रहे हों। आपके अनुरोधों को सीमित करने की आवश्यकता को एक एकल डोमेन के मामले में प्रतिपादन का समय पूरी तरह से नगण्य बना देगा।
दर सीमा / बॉट व्यवहार
इसके लिए आपको बहुत जागरूक होने की आवश्यकता है। आपको उचित दर पर अपने लक्ष्य डोमेन के लिए अनुरोध करने की आवश्यकता है। आपको वेबसाइटों को क्रॉल करते समय एक अच्छी तरह से व्यवहार किए गए बॉट को लिखने की आवश्यकता है, और इसका मतलब है कि robots.txt का सम्मान करना और अनुरोधों के साथ सर्वर को हथौड़ा नहीं करना है। यहां गलतियां या लापरवाही बहुत ही अनैतिक है क्योंकि इसे सेवा हमले से इनकार किया जा सकता है। स्वीकार्य दर इस आधार पर भिन्न होती है कि आप किससे पूछते हैं, 1req / s वह अधिकतम है जो Google क्रॉलर पर चलता है लेकिन आप Google नहीं हैं और संभवतः Google के रूप में आपका स्वागत नहीं है। इसे यथोचित रूप से धीमा रखें। मैं प्रत्येक पृष्ठ अनुरोध के बीच 2-5 सेकंड का सुझाव दूंगा।
एक उपयोगकर्ता एजेंट स्ट्रिंग के साथ अपने अनुरोधों को पहचानें जो आपके बॉट की पहचान करता है और आपके बॉट के लिए एक वेबपेज है जो यह समझाता है कि यह उद्देश्य है। यह url एजेंट स्ट्रिंग में जाता है।
यदि साइट आपको ब्लॉक करना चाहती है तो आपको ब्लॉक करना आसान होगा। उनके अंत पर एक स्मार्ट इंजीनियर आसानी से बॉट्स की पहचान कर सकता है और उनके अंत में कुछ मिनटों का काम आपके अंत में आपके स्क्रैपिंग कोड को बदलने या बस इसे असंभव बनाने के हफ्तों का कारण बन सकता है। यदि संबंध विरोधी है, तो लक्ष्य साइट पर एक स्मार्ट इंजीनियर पूरी तरह से क्रॉलर लिखने वाले जीनियस इंजीनियर को पूरी तरह से उत्तेजित कर सकता है। स्क्रैपिंग कोड स्वाभाविक रूप से नाजुक है और यह आसानी से शोषण किया जाता है। कुछ ऐसा जो इस प्रतिक्रिया को भड़काएगा वैसे भी लगभग अनैतिक है, इसलिए एक अच्छा व्यवहार करें और इस बारे में चिंता न करें।
परिक्षण
इकाई / एकीकरण परीक्षण व्यक्ति नहीं? बहुत बुरा। अब आपको एक बनना होगा। साइटें बार-बार बदलती हैं और आप बार-बार अपना कोड बदलते रहेंगे। यह चुनौती का एक बड़ा हिस्सा है।
एक आधुनिक वेबसाइट को स्क्रैप करने में बहुत सारे मूविंग पार्ट्स शामिल हैं, अच्छे परीक्षण अभ्यास से बहुत मदद मिलेगी। इस प्रकार के कोड लिखते समय आपके द्वारा किए जाने वाले कई कीड़े प्रकार होंगे जो केवल दूषित डेटा को चुपचाप वापस कर देंगे। बिना जांच के जांच के लिए आप बिना डेटाबेस को कुछ समय के लिए बेकार भ्रष्ट डेटा की बचत कर रहे हैं। यह परियोजना आपको डेटा सत्यापन (उपयोग करने के लिए कुछ अच्छी लाइब्रेरी खोजें) और परीक्षण से बहुत परिचित करेगी। कई अन्य समस्याएं नहीं हैं जो व्यापक परीक्षणों की आवश्यकता को जोड़ती हैं और परीक्षण करना बहुत मुश्किल है।
आपके परीक्षणों के दूसरे भाग में कैशिंग और परिवर्तन का पता लगाना शामिल है। अपना कोड लिखते समय आप बिना किसी कारण के एक ही पृष्ठ के लिए सर्वर को बार-बार हथौड़ा करना चाहते हैं। अपनी इकाई परीक्षण चलाते समय आप जानना चाहते हैं कि क्या आपके परीक्षण विफल हो रहे हैं क्योंकि आपने अपना कोड तोड़ा है या क्योंकि वेबसाइट को नया रूप दिया गया है। शामिल किए गए url की कैश्ड प्रतिलिपि के विरुद्ध अपनी इकाई परीक्षण चलाएं। एक कैशिंग प्रॉक्सी यहां बहुत उपयोगी है लेकिन ठीक से कॉन्फ़िगर और उपयोग करने के लिए मुश्किल है।
आप यह भी जानना चाहते हैं कि क्या साइट बदल गई है। यदि उन्होंने साइट को फिर से डिज़ाइन किया और आपका क्रॉलर टूट गया तो आपकी यूनिट के परीक्षण अभी भी पास हो जाएंगे क्योंकि वे एक कैश्ड कॉपी के खिलाफ चल रहे हैं! आपको या तो दूसरे, छोटे सेट एकीकरण परीक्षणों की आवश्यकता होगी, जो लाइव साइट के खिलाफ बार-बार चलते हैं या आपके क्रॉलिंग कोड में अच्छी लॉगिंग और त्रुटि का पता लगाते हैं जो सटीक मुद्दों को लॉग करता है, आपको समस्या से सचेत करता है और क्रॉल करना बंद कर देता है। अब आप अपना कैश अपडेट कर सकते हैं, अपने यूनिट टेस्ट चला सकते हैं और देख सकते हैं कि आपको क्या बदलने की जरूरत है।
कानूनी मुद्दे
अगर आप बेवकूफी भरे काम करते हैं तो यहां कानून थोड़ा खतरनाक हो सकता है। यदि कानून शामिल हो जाता है तो आप ऐसे लोगों से निपट रहे हैं जो नियमित रूप से "हैकिंग टूल" के रूप में विग और कर्ल का उल्लेख करते हैं। आप यह नहीं चाहते।
स्थिति की नैतिक वास्तविकता यह है कि url का अनुरोध करने के लिए ब्राउज़र सॉफ़्टवेयर का उपयोग करने और कुछ डेटा को देखने और अपने स्वयं के सॉफ़्टवेयर का उपयोग करके url का अनुरोध करने और कुछ डेटा को देखने के बीच कोई अंतर नहीं है। Google दुनिया की सबसे बड़ी स्क्रैपिंग कंपनी है और उन्हें इसके लिए प्यार किया जाता है। उपयोगकर्ता एजेंट में अपने बॉट्स नाम की पहचान करना और अपने वेब क्रॉलर के लक्ष्यों और इरादों के बारे में खुला रहना यहां मदद करेगा क्योंकि कानून समझता है कि Google क्या है। यदि आप कुछ भी छायादार कर रहे हैं, जैसे कि नकली उपयोगकर्ता खाते बनाना या साइट के उन क्षेत्रों तक पहुंच बनाना जो आपको (या तो रोबॉट्स.नेट द्वारा "अवरुद्ध" नहीं होना चाहिए या किसी प्रकार के प्राधिकरण शोषण के कारण) तो ध्यान रखें कि आप कुछ अनैतिक कर रहे हैं और कानून की तकनीक की अज्ञानता यहां असाधारण रूप से खतरनाक होगी। यह एक हास्यास्पद स्थिति है, लेकिन यह एक वास्तविक है।
एक उत्कृष्ट नागरिक के रूप में ऊपर और ऊपर एक नए खोज इंजन का प्रयास करना और उसका निर्माण करना वस्तुतः संभव है, गलती करना या आपके सॉफ़्टवेयर में बग होना और हैकर के रूप में देखा जाना। ऐसा कुछ नहीं जो आप वर्तमान राजनीतिक वास्तविकता पर विचार करना चाहते हैं।
मैं वैसे भी पाठ की इस विशाल दीवार को लिखने वाला कौन हूं?
मैंने अपने जीवन में बहुत सारे वेब क्रॉलिंग संबंधित कोड लिखे हैं। मैं एक दशक से अधिक समय से सलाहकार, कर्मचारी और स्टार्टअप संस्थापक के रूप में वेब से संबंधित सॉफ्टवेयर विकास कर रहा हूं। शुरुआती दिन पर्ल क्रॉलर / स्क्रैपर्स और php वेबसाइट लिख रहे थे। जब हम जेसी जेम्स ग्राट्ट ने इसे अजाक्स नाम देने से पहले वेबपेजों में सीएसवी डेटा लोड करने के लिए छिपे हुए iframes को एम्बेड कर रहे थे, तो XMLHTTPRequest से पहले एक विचार था। JQuery से पहले, json से पहले। मैं अपने 30 के दशक के मध्य में हूं, जो इस व्यवसाय के लिए स्पष्ट रूप से प्राचीन माना जाता है।
मैंने बड़े पैमाने पर क्रॉलिंग / स्क्रैपिंग सिस्टम दो बार लिखा है, एक बार एक बड़ी कंपनी के लिए एक मीडिया कंपनी (पर्ल में) और हाल ही में एक छोटी टीम के लिए सर्च इंजन स्टार्टअप के सीटीओ (पायथन / जावास्क्रिप्ट में) के रूप में। मैं वर्तमान में एक सलाहकार के रूप में काम करता हूं, ज्यादातर क्लोजर / क्लोजरस्क्रिप्ट (सामान्य रूप से एक अद्भुत विशेषज्ञ भाषा में कोडिंग है और इसमें लाइब्रेरी हैं जो क्रॉलर / स्क्रैपर की समस्याओं को एक सुखद बनाते हैं)
मैंने सफल एंटी-क्रॉलिंग सॉफ्टवेयर सिस्टम भी लिखा है। यदि आप चाहते हैं या आपको पसंद न आने वाले बॉट्स को पहचानना या तोड़ना चाहते हैं, तो यह गैर-अयोग्य साइटों को लिखना आसान है।
मुझे किसी अन्य प्रकार के सॉफ़्टवेयर से अधिक क्रॉलर, स्क्रैपर्स और पार्सर लिखना पसंद है। यह चुनौतीपूर्ण है, मज़ेदार है और इसका इस्तेमाल अद्भुत चीजें बनाने के लिए किया जा सकता है।