jQuery

2011-04-14 8 views
40

का उपयोग कर सरल स्क्रीन स्क्रैपिंग मैं jQuery का उपयोग करके एक साधारण स्क्रीन-स्क्रैपर का उपयोग करने के विचार के साथ खेल रहा हूं और मुझे आश्चर्य है कि निम्नलिखित संभव है या नहीं।jQuery

मैं साधारण HTML पृष्ठ है और एक प्रयास कर रही हूँ (अगर यह संभव है) तो की तरह, एक और पृष्ठ से सूची आइटम के सभी की सामग्री को हड़पने के लिए:

मुख्य पृष्ठ:

<!-- jQuery --> 
<script type='text/javascript'> 
$(document).ready(function(){ 
$.getJSON("[URL to other page]", 
    function(data){ 

    //Iterate through the <li> inside of the URL's data 
    $.each(data.items, function(item){ 
     $("<li/>").value().appendTo("#data"); 
    }); 

    }); 
}); 
</script> 

<!-- HTML --> 
<html> 
    <body> 
     <div id='data'></div> 
    </body> 
</html> 

अन्य पृष्ठ:

//Html 
<body> 
    <p><b>Items to Scrape</b></p> 
    <ul> 
     <li>I want to scrape what is here</li> 
     <li>and what is here</li> 
     <li>and here as well</li> 
     <li>and append it in the main page</li> 
    </ul> 
</body> 

इसलिए, यह है किसी बाहरी पृष्ठ से सभी सूची आइटम सामग्रियों को खींचने के लिए jQuery का उपयोग करना और उन्हें div के अंदर जोड़ना संभव है?

+0

यह भी जावास्क्रिप्ट में वर्तमान पृष्ठ का पाठ (टैग) के बिना प्राप्त करना संभव है: http://stackoverflow.com/questions/5321739/how-can-i-get-the-text-only- नो-टैग-ए-एचटीएमएल-दस्तावेज़ –

उत्तर

33

दूसरे पृष्ठ को एक चर में लोड करने के लिए $.ajax का उपयोग करें, फिर एक अस्थायी तत्व बनाएं और सामग्री को वापस लौटने के लिए सामग्री सेट करने के लिए .html() का उपयोग करें। नोड टाइप 1 के तत्व के बच्चों के माध्यम से लूप करें और अपने पहले बच्चों के नोडवेल को रखें। यदि बाहरी पृष्ठ आपके वेब सर्वर पर नहीं है तो आपको फ़ाइल को अपने वेब सर्वर से प्रॉक्सी करना होगा।

कुछ इस तरह:

$.ajax({ 
    url: "/thePageToScrape.html", 
    dataType: 'text', 
    success: function(data) { 
      var elements = $("<div>").html(data)[0].getElementsByTagName("ul")[0].getElementsByTagName("li"); 
      for(var i = 0; i < elements.length; i++) { 
       var theText = elements[i].firstChild.nodeValue; 
       // Do something here 
      } 
    } 
}); 
+0

क्या आप "प्रॉक्सी फ़ाइल" का अर्थ क्या अधिक विस्तार से जा सकते हैं? –

+1

@AdamYoungers: "प्रॉक्सी फ़ाइल" काफी सुंदर वर्णन है। अपने सर्वर से अनुरोध करें; अपना स्वयं का सर्वर लक्ष्य से अनुरोधित पृष्ठ प्राप्त करें। Nginx में, यह 'proxy_pass' होगा। यदि आप इसे PHP में करना चाहते हैं, तो आप ' '। – Ryan

+0

हालांकि, प्रॉक्सी संसाधनों के सामग्री-प्रकार को श्वेतसूची में रखना सुनिश्चित करें; एक्सएचआर को इंगित करने वाले कस्टम हेडर के लिए जोड़ें और जांचें; खुली प्रॉक्सी बनाने से बचें; जब संभव हो तो सीओआरएस का उपयोग करें, और प्रॉक्सी को एक अलग डोमेन पर रखें। – Ryan

6
$.get("/path/to/other/page",function(data){ 
    $('#data').append($('li',data)); 
} 
5

इस तो ही डोमेन के लिए तो कोई समस्या नहीं है - jQuery समाधान अच्छा है।

लेकिन अन्यथा आप मनमानी वेबसाइट से सामग्री तक नहीं पहुंच सकते हैं क्योंकि इसे सुरक्षा जोखिम माना जाता है। same origin policy देखें।

निश्चित रूप से वेब प्रॉक्सी या CORS headers जैसे सर्वर साइड वर्कअराउंड हैं। यदि आप भाग्यशाली हैं तो वे jsonp का समर्थन करेंगे।

लेकिन यदि आप किसी क्लाइंट साइड समाधान को मनमाने ढंग से वेबसाइट और वेब ब्राउज़र के साथ काम करना चाहते हैं तो आप भाग्य से बाहर हैं। proposal to relax this policy है, लेकिन यह वर्तमान वेब ब्राउज़र को प्रभावित नहीं करेगा।

+5

आपके डोमेन के बाहर सामग्री तक पहुंचने के कई तरीके हैं। उदाहरण के लिए: • jsonp • प्रॉक्सी – lightyrs

+0

समान उत्पत्ति नीति सफारी पर कोई समस्या नहीं है और ठीक से प्रारंभिक क्रोम –

+0

@LukeMcneice क्या आप समझा सकते हैं कि मूल नीति सफारी और क्रोम में नहीं है? यह भी सही ढंग से शुरू करने का क्या अर्थ है? – user566245

1

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

नकारात्मक पक्ष पर: YQL और याहू पाइप लक्ष्य डोमेन के लिए robots.txt फ़ाइल को ओबीआई करें और यदि पृष्ठ लंबे समय तक याहू पाइप्स regex आदेश नहीं चलेंगे।

5

आप pjscrape विचार कर सकते हैं:

http://nrabinowitz.github.io/pjscrape/

यह आप कमांड लाइन से ऐसा करने के लिए, जावास्क्रिप्ट और jQuery का उपयोग कर सकते हैं। यह फ़ैंटॉमजेएस का उपयोग करके करता है, जो एक हेडलेस वेबकिट ब्राउज़र है (इसमें कोई विंडो नहीं है, और यह केवल आपकी स्क्रिप्ट के उपयोग के लिए मौजूद है, इसलिए आप जटिल वेबसाइटों को लोड कर सकते हैं जो AJAX का उपयोग करते हैं और यह काम करेगा जैसे कि यह एक असली ब्राउज़र था) ।

उदाहरण आत्म-व्याख्यात्मक हैं और मेरा मानना ​​है कि यह सभी प्लेटफार्मों (विंडोज़ सहित) पर काम करता है।

4

jQuery के साथ सरल scraping ...

// Get HTML from page 
$.get('http://example.com/', function(html) { 

    // Loop through elements you want to scrape content from 
    $(html).find("ul").find("li").each(function(){ 

     var text = $(this).text(); 
     // Do something with content 

    }) 

}); 
0

मुझे यकीन है कि आप कई मामलों में अनुरोध के साथ CORS मुद्दा मारा जाएगा। here से CORS समस्या को हल करने का प्रयास करें।

var name = "kk"; 
var url = "http://anyorigin.com/go?url=" + encodeURIComponent("https://www.yoursite.xyz/") + name + "&callback=?"; 
$.get(url, function(response) { 
    console.log(response); 
});