2008-12-27 6 views
6

के साथ किसी पृष्ठ के पृष्ठभूमि लोड और स्क्रैपिंग को कैसे निष्पादित करें मैं अपने टूलबार के मालिकों को उनके प्रश्न/उत्तर/आदि पर अपडेट की गई जानकारी देने के लिए SO के उपयोगकर्ता पृष्ठों को स्क्रैप करना चाहता हूं ...XUL/फ़ायरफ़ॉक्स एक्सटेंशन

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

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

पुराना सवाल पाठ

मैं एक अच्छी जगह जानने के लिए कैसे मैं एक समारोह कहा जाता है के अंदर एक पेज लोड कर सकते हैं के लिए देख रहा हूँ पृष्ठभूमि में एक स्क्रीन scraping कार्रवाई करने के लिए कुख्यात set_timeout() खरीदते हैं।

मेरा विचार स्टेटस बार एक्सटेंशन में ऐसे स्क्रैपिंग के परिणाम प्रस्तुत करना है, बस अंतिम रन से किसी चीज में बदलाव होने पर।

क्या कोई छुपा ओवरले या कुछ अन्य अव्यवस्था है?

उत्तर

6

XUL/फ़ायरफ़ॉक्स, आपको क्या चाहिए nsIIOService इंटरफ़ेस है, जो आप इस तरह मिल सकता है के मामले में:

var mIOS = Components.classes["@mozilla.org/network/io-service;1"]. 
    getService(Components.interfaces.nsIIOService); 

तो फिर तुम एक चैनल बनाने की आवश्यकता है, और एक अतुल्यकालिक लिंक को खोलने:

var StreamListener = function() { 
    return { 
     QueryInterface: function(aIID) { 
      if (aIID.equals(Components.interfaces.nsIStreamListener) || 
       aIID.equals(Components.interfaces.nsISupportsWeakReference) || 
       aIID.equals(Components.interfaces.nsISupports)) 
       return this; 
      throw Components.results.NS_NOINTERFACE; 

     onStartRequest: function(aRequest, aContext) 
      { return 0; }, 

     onStopRequest: function(aRequest, aChannel /* aContext */, aStatusCode) 
      { return 9; }, 

     onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount) 
      { return 0; } 
    }; 
} 

आपके पास:

var channel = mIOS.newChannel(urlToOpen, 0, null); 
channel.asyncOpen(new StreamListener(), channel); 

कुंजी यहाँ StreamListener वस्तु है onStartRequest, onStopRequest, onDataAvailable फ़ंक्शंस में विवरण भरने के लिए, लेकिन यह आपको जाने के लिए पर्याप्त होना चाहिए। आप देख सकते हैं कि मैंने अपने फ़ायरफ़ॉक्स एक्सटेंशन में इस इंटरफ़ेस का उपयोग कैसे किया (इसे पहचानफैविकॉन कहा जाता है, और यह मोज़िला ऐड-ऑन साइट पर पाया जा सकता है)।

जो भाग मैं अनिश्चित हूं, वह यह है कि आप समय-समय पर इस पृष्ठ के अनुरोध को कैसे ट्रिगर कर सकते हैं, set_timeout() शायद काम करना चाहिए।

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

  1. उदाहरण here (देखें अनुभाग छवियाँ डाउनलोड कर रहा है) एक एकल चर में डाउनलोड की गई डेटा एकत्र करने के तरीके के बारे में एक उदाहरण के लिए देखें; और
  2. एक HTML स्रोत को एक DOM पेड़ में परिवर्तित करने के तरीके पर this page देखें।

एचटीएच।

+0

परिणामी "पृष्ठ" को तब डीओएम ऑब्जेक्ट के रूप में उपयोग किया जा सकता है? –

+0

मैंने अपने संपादन में इसका उत्तर देने की कोशिश की। –

1

विशेषाधिकार प्राप्त जावास्क्रिप्ट से, यानी एक विस्तार में जेएस, आपको छुपा iframe एस बनाने की अनुमति है; निर्दिष्ट पृष्ठ को डाउनलोड करना इस फ्रेम पर स्थान सेट करने जितना आसान है।

यदि आप अपने स्वामित्व वाले एक साधारण, स्थिर पृष्ठ को खींच रहे हैं, तो set_timeout ठीक होना चाहिए। लेकिन उस मामले में, एक्सएचआर का उपयोग क्यों नहीं करें?

यदि आप मनमानी पृष्ठों को खींच रहे हैं, गतिशील तत्वों या बहुत सारी सामग्री वाले, मैं Document.onload ईवेंट हैंडलर का उपयोग करके पृष्ठ के अपने स्क्रैप को ट्रिगर करने की अनुशंसा करता हूं। यह अधिक विश्वसनीय तरीका है, और आप जल्द से जल्द संभव पृष्ठ पर पृष्ठ को स्क्रैप करने के बारे में चालाक हो सकते हैं, लेकिन जब आप जानते हैं कि आवश्यक सामग्री है।

मुझे नहीं लगता कि इस पर एक विशिष्ट ट्यूटोरियल है, लेकिन Mozilla Developer Center, जो मुझे यकीन है कि आप पहले ही पा चुके हैं, बिल्कुल उत्कृष्ट है - मेरी राय में सबसे अच्छा ऑनलाइन तकनीकी दस्तावेज!

+0

क्या एक्सटेंशन पर एक्सएचआर अन्य डोमेन तक पहुंचने की अनुमति देता है? क्या मैं एक्सएचआर से खींचने वाले एचटीएमएल पर फ़ायरफ़ॉक्स डीओएम सुविधाओं का उपयोग कर सकता हूं। –

3

मुझे यकीन है कि अगर मैं सवाल पूरी तरह से समझा नहीं गया हूँ, लेकिन कुछ स्पष्ट विकल्प सवालों के जवाब देने की कोशिश करेंगे:

आप देख रहे हैं स्थिर वेब पेज scraping BeautifulSoup (अजगर) के लिए सबसे अच्छा और आसान में से एक है ।

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

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

+0

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

0

XMLHttpRequest पर एक नज़र डालें, आपको शुरू करना चाहिए।