2011-09-07 9 views
8

का उपयोग कर वेब साइट स्क्रैपिंग में समस्याएं मुझे कुछ वेब स्क्रैपिंग करने की आवश्यकता है। विभिन्न वेब परीक्षण ढांचे के साथ खेलने के बाद, जिनमें से अधिकतर मेरी धीमी (सेलेनियम) या मेरी जरूरतों के लिए बहुत छोटी गाड़ी (env.js), मैंने फैसला किया कि zombie.js सबसे अधिक आशाजनक दिखता है, क्योंकि यह HTML पार्सिंग के लिए पुस्तकालयों के ठोस सेट का उपयोग करता है और डोम हेरफेर। हालांकि, मुझे लगता है जैसे कि यह भी निम्नलिखित वेब पेज में जैसे बुनियादी घटना आधारित जावास्क्रिप्ट कोड का समर्थन नहीं करता:zombie.js

<html> 
    <head> 
    <title>test</title> 
    <script type="text/javascript"> 

     console.log("test script executing..."); 
     console.log("registering callback for event DOMContentLoaded on " + document); 

     document.addEventListener('DOMContentLoaded', function(){ 
     console.log("DOMContentLoaded triggered"); 
     }, false); 

     function loaded() { 
     console.log("onload triggered"); 
     } 

    </script> 
    </head> 

    <body onload="loaded();"> 
    <h1>Test</h1> 
    </body> 
</html> 

मैं तो इस तरह मैन्युअल रूप से उन घटनाओं को गति प्रदान करने का निर्णय लिया:

zombie = require("zombie"); 

zombie.visit("http://localhost:4567/", { debug: true }, function (err, browser, status) { 

    doc = browser.document; 
    console.log("firing DOMContentLoaded on " + doc); 
    browser.fire("DOMContentLoaded", doc, function (err, browser, status) { 

    body = browser.querySelector("body"); 
    console.log("firing load on " + body); 
    browser.fire("load", body, function (err, browser, status) { 

     console.log(browser.html()); 

    }); 
    }); 

}); 

जो इस विशेष परीक्षण पृष्ठ के लिए काम करता है। मेरी समस्या एक सामान्य बात है, हालांकि: मैं फेसबुक पर दोस्तों की सूची जैसे कुछ जटिल, AJAX- आधारित साइटों को स्क्रैप करने में सक्षम होना चाहता हूं (http://www.facebook.com/profile.php?id=100000028174850&sk=friends&v=friends जैसे कुछ)। ज़ोंबी का उपयोग करके साइट में लॉग इन करने में कोई समस्या नहीं है, लेकिन उन सूचियों की तरह कुछ सामग्री पूरी तरह से AJAX का उपयोग करके गतिशील रूप से लोड हो रही है, और मुझे नहीं पता कि लोडिंग शुरू करने वाले ईवेंट हैंडलर को कैसे ट्रिगर करना है।

कई सवाल मैं इस समस्या के बारे में है के होते हैं:

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

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

+0

क्या आप जावास्क्रिप्ट परीक्षण ढांचे, या एक वेब डेटा-निष्कर्षण उपकरण की तलाश में हैं? यदि आप केवल एक स्क्री-स्क्रैपिंग टूल की तलाश में हैं, तो संभवतः AJAX- भारी वाले लोगों को अपने जावास्क्रिप्ट को निष्पादित किए बिना अधिकांश साइटों को स्क्रैप करना संभव है। – chesles

+1

सवाल वेब स्क्रैपिंग के बारे में है। आप सही हैं, जेएस निष्पादित किए बिना अक्सर ऐसा करना संभव है, उदा। मैन्युअल रूप से आरईएसटी अनुरोध जारी करके। फेसबुक के मामले में, साइट के मोबाइल संस्करण को स्क्रैप करना केवल HTTP और HTML पार्सिंग का उपयोग करके काफी संभव है। लेकिन मुझे एक सामान्य समाधान में रूचि है जो जावास्क्रिप्ट को समझता है और वास्तविक ब्राउजर इंस्टेंस की आवश्यकता नहीं है। यह संभव है, जैसा कि env.Js और zombie.Js दिखाते हैं, लेकिन ऐसा लगता है कि यह एक चाल समस्या है। –

उत्तर

12

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

अधिकांश साइटों, यहां तक ​​कि AJAX भारी हैं, उनके जावास्क्रिप्ट कोड की एक पंक्ति को क्रियान्वित करने के बिना स्क्रैप जा सकता है। वास्तव में साइट के जावास्क्रिप्ट कोड को समझने की कोशिश करने से आमतौर पर यह आसान होता है, जिसे अक्सर डिबग करने, कम करने और डीबग करने में मुश्किल होती है। आप HTTP की एक ठोस समझ आप समझ जायेंगे क्यों है: (लगभग) सर्वर के सभी क्रियाकलापों को HTTP अनुरोध के रूप में एन्कोड रहे हैं, इसलिए है कि क्या वे जावास्क्रिप्ट द्वारा किए जाते हैं या उपयोगकर्ता के लिए एक कड़ी है, या एक बॉट कार्यक्रम में कस्टम कोड पर क्लिक करके, सर्वर में कोई फर्क नहीं पड़ता है। (मैं लगभग इसलिए कहता हूं कि जब फ्लैश या एप्लेट शामिल होते हैं तो वहां कोई डेटा नहीं उड़ रहा है; वे एप्लिकेशन-विशिष्ट हो सकते हैं। लेकिन जावास्क्रिप्ट में किए गए कुछ भी HTTP पर जायेंगे।)

कहा जा रहा है, यह संभव है कस्टम सॉफ्टवेयर का उपयोग कर किसी भी वेबसाइट पर उपयोगकर्ता की नकल करें। सबसे पहले आपको सर्वर पर भेजे गए कच्चे HTTP अनुरोधों को देखने में सक्षम होना चाहिए। लक्ष्य वेबसाइट पर वास्तविक ब्राउज़र द्वारा किए गए अनुरोधों को रिकॉर्ड करने के लिए आप प्रॉक्सी सर्वर का उपयोग कर सकते हैं। वहाँ कई, कई उपकरण तो आप इस के लिए उपयोग कर सकते हैं: Charles या Fiddler काम कर रहे हैं, सबसे समर्पित screen-scraper tools एक बुनियादी प्रॉक्सी में निर्मित है, फ़ायरफ़ॉक्स और क्रोम के लिए Firebug विस्तार AJAX अनुरोध को देखने के लिए इसी तरह के उपकरण है ... आप विचार प्राप्त ।

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

विभिन्न क्षमताओं की पेशकश करने वाली विभिन्न भाषाओं के लिए अलग-अलग पुस्तकालय हैं। रूबी के लिए, मैंने mechanize for ruby का उपयोग करके बहुत से लोगों को देखा है।

यदि डेटा निष्कर्षण आपका एकमात्र लक्ष्य है, तो आप लगभग हमेशा HTTP अनुरोधों की नकल करके आपको जो चाहिए उसे प्राप्त करने में सक्षम होंगे। कोई जावास्क्रिप्ट आवश्यक है।

नोट - चूंकि आप फेसबुक उल्लेख किया है, मैं, का उल्लेख करना चाहिए कि फेसबुक scraping विशेष रूप से असाधारण रूप से कठिन है (हालांकि असंभव नहीं) हो सकता है क्योंकि फेसबुक स्वचालित पहुँच पता लगाने के लिए जगह में उपायों है (वे और अधिक बस कैप्चा से उपयोग करें); यदि वे संदिग्ध गतिविधि से आते हैं तो वे एक खाता अक्षम कर देंगे। यह सब के बाद, उनके terms of service (धारा 3.2) के खिलाफ है।

+1

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

+0

यह सच है, फेसबुक और अन्य साइटें आपके साइट को स्क्रैप करने के लिए जितना संभव हो उतना कठिन बनाने की कोशिश करती हैं; वे आपको अपने एपीआई का उपयोग करना पसंद करते हैं ताकि वे आपके प्रोग्राम तक पहुंचने के लिए बेहतर नियंत्रण कर सकें, और इसलिए बेहतर ढंग से अपने उपयोगकर्ताओं की गोपनीयता की रक्षा कर सकते हैं। – chesles

+0

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