स्थिर और कुशल तरीके से वेबपृष्ठ से डेटा प्राप्त करना


11

हाल ही में मुझे पता चला है कि जिस डेटा की आपको आवश्यकता है, उसे प्राप्त करने के लिए एक वेबसाइट के HTML को पार्स करने के लिए एक regex का उपयोग करना कार्रवाई का सबसे अच्छा कोर्स नहीं है।

तो मेरा प्रश्न सरल है: इस डेटा को प्राप्त करने के लिए सबसे अच्छा / सबसे कुशल और आम तौर पर स्थिर तरीका क्या है?

मुझे ध्यान देना चाहिए कि:

  • कोई एपीआई नहीं है
  • कोई अन्य स्रोत नहीं है जहां मैं डेटा प्राप्त कर सकता हूं (कोई डेटाबेस, फ़ीड और ऐसे नहीं)
  • स्रोत फ़ाइलों तक कोई पहुँच नहीं है। (सार्वजनिक वेबसाइटों से डेटा)
  • मान लें कि डेटा सामान्य पाठ है, एक html पृष्ठ में तालिका में प्रदर्शित किया गया है

मैं वर्तमान में अपनी परियोजना के लिए अजगर का उपयोग कर रहा हूं, लेकिन एक भाषा स्वतंत्र समाधान / युक्तियां अच्छी होंगी।

एक पक्ष के सवाल के रूप में: जब अजाक्स कॉल द्वारा वेबपेज का निर्माण किया जाता है, तो आप इसके बारे में कैसे जाएंगे?

संपादित करें:

HTML पार्सिंग के मामले में, मुझे पता है कि डेटा प्राप्त करने का कोई वास्तविक स्थिर तरीका नहीं है। जैसे ही पेज बदलता है, आपके पार्सर के लिए किया जाता है। इस मामले में मेरे पास स्थिर होने का मतलब है: पृष्ठ को पार्स करने का एक कुशल तरीका, जो मुझे हमेशा एक ही परिणाम देता है (डेटा के समान सेट के लिए) जाहिर है कि पृष्ठ नहीं बदलता है।


8
कोई स्थिर तरीका नहीं है, चाहे आप अपने स्क्रैपिंग को कैसे लागू करें, यह आसानी से वेबपेज के एक साधारण बदलाव के साथ टूट सकता है। आपके डेटा को प्राप्त करने के लिए अस्तबल का तरीका डेटा के लेखकों से संपर्क करना है और ब्रोकर को डेटा को साने प्रारूप में प्राप्त करने के लिए सौदा करना है। कभी-कभी पैसा खर्च भी नहीं होता है।
जोकिम सॉयर

1
@JoachimSauer - प्रश्न का उत्तर अभी भी 'सर्वश्रेष्ठ' पद्धति से दिया जा सकता है।
बेनामी

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

साइट स्क्रैपिंग स्कीजी व्यवसाय है। ऐसा करने का वास्तव में कोई स्थिर तरीका नहीं है क्योंकि साइट के मालिक आपको नहीं चाहते हैं, और एक पूरे के रूप में उद्योग लोगों को ऐसा करने से रोकने की कोशिश कर रहा है।
स्टीवन एवर्स

1
हो सकता है कि वेबकिट जैसे वेब ब्राउज़र को एम्बेड करें और फिर प्रदान किए गए पृष्ठ से जानकारी प्राप्त करने के लिए DOM स्क्रिप्टिंग का उपयोग करें? लगभग हर प्लेटफ़ॉर्म ऐसा कर सकता है, लेकिन यहाँ आप इसे Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

जवाबों:


2

खैर, यहाँ मेरे 2 सेंट हैं:

यदि कोई AJAX शामिल नहीं है, या इसे आसानी से HTML को XHTML (उदाहरण के लिए HTMLTidy का उपयोग करके) को 'ठीक' किया जा सकता है, तो जानकारी निकालने के लिए नियमित अभिव्यक्तियों के बजाय XPath का उपयोग करें।
एक अच्छी तरह से संरचित वेब पेज में, जानकारी की तार्किक रूप से अलग-अलग इकाइयाँ अलग-अलग हैं <div>, या जो भी अन्य टैग हैं, जिसका अर्थ है कि आप एक सरल XPath अभिव्यक्ति के साथ आसानी से सही जानकारी पा सकेंगे। यह इसलिए भी बढ़िया है क्योंकि आप इसे Chrome के कंसोल या फ़ायरफ़ॉक्स डेवलपर डेवलपर कंसोल में कह सकते हैं और सत्यापित कर सकते हैं कि अन्य कोड की एक पंक्ति लिखने से पहले यह काम करता है।
इस दृष्टिकोण में बहुत अधिक सिग्नल-टू-शोर अनुपात है, क्योंकि आमतौर पर संबंधित जानकारी का चयन करने के लिए अभिव्यक्तियाँ एक-लाइनर होंगी। वे नियमित अभिव्यक्तियों की तुलना में पढ़ने में आसान हैं और इस उद्देश्य के लिए डिज़ाइन किए गए हैं।

यदि पेज में शामिल AJAX और गंभीर जावास्क्रिप्ट-आईएनजी है, तो एप्लिकेशन में एक ब्राउज़र घटक एम्बेड करें और अपनी DOM को उन घटनाओं को ट्रिगर करने के लिए उपयोग करें, और जानकारी निकालने के लिए XPath। वहाँ से बाहर बहुत अच्छे एम्बेड करने योग्य ब्राउज़र घटक हैं, जिनमें से अधिकांश हूड के नीचे वास्तविक दुनिया के ब्राउज़र का उपयोग करते हैं, जो एक अच्छी बात है, क्योंकि एक वेब-पेज गलत हो सकता है (एक्स) एचटीएमएल, लेकिन फिर भी सभी प्रमुख ब्राउज़रों पर अच्छा प्रस्तुत करता है ( वास्तव में, अधिकांश पृष्ठ अंततः इस तरह से प्राप्त होते हैं)।


धन्यवाद, मैं निश्चित रूप से कुछ और XPath पर एक नज़र डालूँगा। मुझे इसके साथ काम करने की आदत नहीं है, इसलिए यह सीखना अच्छी बात होगी। +1 :)
माइक

5

मेरे अनुभव में, .NET वातावरण का उपयोग करके, आप HTML चपलता पैक का लाभ उठा सकते हैं ।

यदि पृष्ठ को एक्सएचटीएमएल के रूप में स्वरूपित किया गया है तो आप एक नियमित XML पार्सर का भी उपयोग कर सकते हैं। वहाँ किसी भी वातावरण के लिए बहुत कुछ है जो आप कल्पना कर सकते हैं।

AJAX के बारे में साइड प्रश्न के लिए, आप डेटा प्राप्त करने और उसे पार्स करने के लिए नियमित HTTP नेटवर्किंग कोड का उपयोग कर सकते हैं।

यदि आपका AJAX स्टैक एक्सएमएल लौटाता है, तो आपको बहुत सारे विकल्प मिलेंगे। यदि यह JSON देता है, तो एक पुस्तकालय पर विचार करें जो आपको टाइप की गई वस्तुओं के लिए स्ट्रीम को मैप करने की अनुमति देता है। .NET में मैं आपको Newtonsoft.Json का सुझाव देता हूं


और 'HTTP नेटवर्किंग कोड' से आपका मतलब है कि अनुरोध किए जाने पर सर्वर की प्रतिक्रिया को कैप्चर करना? सुझावों के लिए धन्यवाद, मैं उन पर गौर करना सुनिश्चित करूंगा। +1
माइक

बिल्कुल सही। .NET में आप System.Net.WebClient या लाइब्रेरी का उपयोग कर सकते हैं जैसे RestSharp | restsharp.org । मैंने इसे Droid के लिए मोनो पर भी उपयोग किया है।
gsscoder

4

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

उदाहरण के लिए पार्स एचटीएमएल, करने के लिए सभी प्रमुख भाषाओं के लिए पुस्तकालय हैं इस एक

किसी भी मामले में, आपको जो मिलेगा वह किसी भी मायने में स्थिर नहीं है। हर बार जब वेबपेज प्रारूप बदलता है, तो आपको अपने स्क्रैपर को अनुकूलित करना होगा।


धन्यवाद, मैं काम पाने के लिए सुंदर सूप का उपयोग कर रहा हूं । मुझे पता है कि यह स्थिर नहीं होगा, मुझे शायद अपने प्रश्नों में स्पष्ट करना चाहिए। आपके लिए +1 :)
माइक

4

एक पक्ष के सवाल के रूप में: जब अजाक्स कॉल द्वारा वेबपेज का निर्माण किया जाता है, तो आप इसके बारे में कैसे जाएंगे?

अगर अजाक्स कॉल किया जा रहा है, तो इसकी संभावना है कि इसके कुछ पोस्ट के साथ कुछ POST या GET url हैं।

मैं यह जानने के लिए जावास्क्रिप्ट की जांच करूंगा कि एंडपॉइंट और पैरामीटर क्या हैं। उसके बाद इसकी बहुत संभावना है कि या तो डेटा लौटाया जाए json / xml / plain text या शायद आंशिक html।

एक बार जब आप उपरोक्त जानकारी जानते हैं, तो आप बस उस समापन बिंदु पर एक GET या POST अनुरोध करते हैं, और लौटे डेटा को पार्स करते हैं।


2
यह देखते हुए कि कई सेवाएं HTTP हेडर का निरीक्षण करती हैं, यह सुनिश्चित करने के लिए HTTP_X_REQUESTED_WITHहै XMLHttpRequest। अच्छे लोग POST अनुरोधों के लिए किसी प्रकार के XSRF सुरक्षा को भी लागू करेंगे, इसलिए आपको जादू की कुकी की भी आवश्यकता होगी। कुछ सार्वजनिक एपीआई द्वारा जानबूझकर उजागर नहीं किए गए AJAX के समापन बिंदु मेरे लिए थोड़ा icky महसूस करते हैं, और यदि उत्पादन (या अनुरोध नीति) बदल जाता है तो आपका खुरचनी टूटने का खतरा है।
टिम पोस्ट

@ टिमपॉस्ट आप 100% सही हैं। मैं इसके "icky" से वास्तव में सहमत हूँ :) लेकिन किसी भी सार्वजनिक एपीआई की अनुपस्थिति में, इसकी आवश्यकता होगी ..
Darknight

मैं अपने स्वयं के AJAX द्वारा संचालित एप्लिकेशन पर इसका उपयोग कर सकता हूं (और 'स्वयं' से मेरा मतलब यह नहीं है कि मैंने इसे लिखा था, लेकिन सेटअप मेरा है), लेकिन किसी अन्य सर्वर के सिस्टम को आज़माना और उसे बायपास करना सही नहीं लगेगा, इसलिए मुझे @ से सहमत होना चाहिए टिमपोस्ट, यह 'इिकी' की तरह महसूस करता है। हालांकि यह एक अच्छा विचार है, धन्यवाद! +1!
माइक

1

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


मुझे पता है कि HTML पृष्ठों को कंप्यूटर द्वारा पार्स नहीं किया जाना था, लेकिन कभी-कभी बस कोई अन्य विकल्प नहीं होता है। इसके अलावा, मैं एक निजी परियोजना के लिए सार्वजनिक रूप से उपलब्ध जानकारी का उपयोग कर रहा हूं जो किसी भी तरह से वाणिज्यिक नहीं है, मुझे नहीं लगता कि मुझे स्पष्ट प्राधिकरण की आवश्यकता है, क्या मुझे? आपके सहयोग के लिए धन्यवाद! +1 आपके लिए भी;)
माइक

@MikeHeremans यह जानने के लिए कि क्या आप किसी वेब साइट से जानकारी प्राप्त करने के लिए अधिकृत हैं, ToS और robots.txt पढ़ें। यदि दोनों आपको सूचना को स्वचालित रूप से बंद करने के अधिकार से वंचित नहीं करते हैं, तो आपको कानूनी रूप से ज्यादातर मामलों में ठीक होना चाहिए। बेशक, IANAL ...
सेफ

यदि आप उल्लिखित परियोजना का कोड देखना पसंद करते हैं: code.google.com/p/acao-toolkit/source/browse/… । Content_script.js की जांच करें, यह वह कोड है जो पेज पर इंजेक्ट किया गया है।
nohros
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.