2011-03-06 19 views
63

Node.js. का उपयोग करके वेबसाइट सामग्री को स्क्रैप करना अच्छा था। मैं कुछ बहुत तेज़ी से बनाना चाहता हूं, जो kayak.com की शैली में खोज निष्पादित कर सकता है, जहां एक क्वेरी कई अलग-अलग साइटों पर भेजी जाती है, परिणाम स्क्रैप किए जाते हैं, और ग्राहक उपलब्ध होने पर ग्राहक के पास लौट जाते हैं।वास्तविक समय में स्क्रैप वेब पेज Node.js

मान लीजिए कि इस स्क्रिप्ट को केवल जेएसओएन प्रारूप में परिणाम प्रदान करना चाहिए, और हम उन्हें सीधे ब्राउज़र में या किसी अन्य वेब एप्लिकेशन में संसाधित कर सकते हैं।

कुछ शुरुआती बिंदु:

Using node.js and jquery to scrape websites

किसी किसी भी विचार है?

+0

मुझे लगता है कि आपका दूसरा लिंक आपके प्रश्न का उत्तर देता है –

+0

@sirhc - node.io _exactly_ जैसा दिख रहा है ... धन्यवाद! – Avishai

+19

node.io के लेखक के रूप में मैं इसके लिए झुका सकता हूं;) – chriso

उत्तर

24

Node.io केक :-)

+15

लेखक के रूप में मैं node.io के लिए vouch कर सकता हूं;) – chriso

+2

Node.io अब बनाए रखा नहीं है। यह मर चुका है, मूल डोमेन नाम बेचा गया था। यह जवाब वर्तमान नहीं है। –

1

तुम हमेशा jQuery की जरूरत नहीं है लेने के लिए लगता है। यदि आप डीओएम के साथ खेलते हैं तो उदाहरण के लिए आप आसानी से ले सकते हैं जो आपको चाहिए (आपको यह भी ध्यान में रखना चाहिए कि आपको xbrowser समस्याओं के बारे में चिंता करने की ज़रूरत नहीं है।) देखें: https://gist.github.com/1335009 जो नोड.ओओ से दूर नहीं जा रहा है, बस इतना कह रहा है कि आप शायद इसे अपने आप करने के लिए सक्षम हो ...

5

सभी उपरोक्त समाधान स्थानीय स्तर पर स्क्रैपर चलाने का अनुमान लगाते हैं। इसका मतलब है कि आप प्रदर्शन में गंभीर रूप से सीमित होंगे (अनुक्रम में या थ्रेड के सीमित सेट में चलने के कारण)। एक बेहतर दृष्टिकोण, आईएमएचओ, मौजूदा, भरोसेमंद, स्क्रैपिंग ग्रिड के बावजूद मौजूदा पर भरोसा करना है।

var bobik = new Bobik("YOUR_AUTH_TOKEN"); 
bobik.scrape({ 
    urls: ['amazon.com', 'zynga.com', 'http://finance.google.com/', 'http://shopping.yahoo.com'], 
    queries: ["//th", "//img/@src", "return document.title", "return $('script').length", "#logo", ".logo"] 
}, function (scraped_data) { 
    if (!scraped_data) { 
    console.log("Data is unavailable"); 
    return; 
    } 
    var scraped_urls = Object.keys(scraped_data); 
    for (var url in scraped_urls) 
    console.log("Results from " + url + ": " + scraped_data[scraped_urls[url]]); 
}); 

यहाँ, scraping दूर से किया जाता है और एक कॉलबैक अपने कोड को जारी किया जाता है केवल जब परिणाम तैयार (वहाँ भी परिणाम को इकट्ठा करने के उपलब्ध होते ही एक विकल्प है) कर रहे हैं:

यहाँ एक उदाहरण है।

आप https://github.com/emirkin/bobik_javascript_sdk

2

मैं अपने आप को अनुसंधान कर रहा हूँ पर Bobik client proxy SDK डाउनलोड कर सकते हैं, और https://npmjs.org/package/wscraper एक

एक वेब स्क्रेपर cheerio.js के आधार पर एजेंट के रूप में अपने आप में समेटे हुए है एक, तेजी से लचीला है, और दुबला कोर jQuery के कार्यान्वयन; request.js के शीर्ष पर बनाया गया; से प्रेरित http-agent.js

बहुत कम उपयोग (npmjs.org के अनुसार) लेकिन किसी भी इच्छुक पार्टियों के लिए एक लायक है।

0

नोड के लिए लिखित सामान्य उद्देश्य स्क्रैपर https://github.com/harish2704/html-scrapper का उपयोग करना मेरा आसान है। जेएस यह पूर्वनिर्धारित स्कीमा के आधार पर जानकारी निकाल सकता है। एक स्कीमा डिफ्निशन में एक सीएसएस चयनकर्ता और डेटा निष्कर्षण फ़ंक्शन शामिल है। वर्तमान में यह डोम पार्सिंग के लिए चीरियो का उपयोग कर रहा है ..

1

ES7/वादों का उपयोग कर

आमतौर पर नया तरीका है जब आप scraping रहे हैं आप

  1. करने के लिए कुछ विधि का उपयोग करने वेबसर्वर पर संसाधन जाओ चाहते हैं (आमतौर पर एचटीएमएल दस्तावेज़)
  2. उस संसाधन को पढ़ें और इसके साथ के रूप में कार्य करें
    1. एक डोम/पेड़ संरचना और इसे नेविगेट करने योग्य
    2. इसे एसएएस जैसे कुछ के साथ टोकन-दस्तावेज़ के रूप में पार्स करें।

दोनों पेड़, और टोकन-पार्सिंग फायदे हैं, लेकिन पेड़ आमतौर पर काफी सरल है। हम ऐसा करेंगे। request-promise की जाँच करें, यहाँ यह कैसे काम करता है:

const rp = require('request-promise'); 
const cheerio = require('cheerio'); // Basically jQuery for node.js 

const options = { 
    uri: 'http://www.google.com', 
    transform: function (body) { 
     return cheerio.load(body); 
    } 
}; 

rp(options) 
    .then(function ($) { 
     // Process html like you would with jQuery... 
    }) 
    .catch(function (err) { 
     // Crawling failed or Cheerio 

यह जो अनिवार्य रूप से एक हल्के सर्वर साइड jQuery-esque पुस्तकालय (कि एक खिड़की वस्तु, या jsdom की जरूरत नहीं है) है cheerio उपयोग कर रहा है।

क्योंकि आप वादे का उपयोग कर रहे हैं, तो आप इसे एक अचूक कार्य में भी लिख सकते हैं। यह तुल्यकालिक गौर करेंगे, लेकिन यह ES7 साथ अतुल्यकालिक हो जाएगा: लेकिन एक बार आप बात करने के लिए मिलता है, जहां आप जरूरत पार्स करने के लिए और

async function parseDocument() { 
    let $; 
    try { 
     $ = await rp(options); 
    } catch (err) { console.error(err); } 

    console.log($('title').text()); // prints just the text in the <title> 
} 
0

मैं सबसे देखने cheerio साथ सही रास्ते जवाब देती है और बहुत आगे है, जावास्क्रिप्ट निष्पादित करें (एला एसपीए और अधिक), तो मैं https://github.com/joelgriffith/navalia (मैं लेखक हूं) की जांच करूंगा। Navalia एक हेडलेस ब्राउज़र संदर्भ में स्क्रैपिंग का समर्थन करने के लिए बनाया गया है, और यह बहुत तेज़ है। धन्यवाद!

संबंधित मुद्दे