2011-03-06 87 views
63

使用Node.js抓取網站內容是一件好事。我想要構建一些速度非常快,可以執行kayak.com風格的搜索,其中一個查詢被分派到幾個不同的站點,結果被刮掉,並在客戶端變得可用時返回給客戶端。使用Node.js實時刮取網頁

我們假設這個腳本應該只提供JSON格式的結果,我們可以直接在瀏覽器或其他Web應用程序中處理它們。

一些出發點:

Using node.js and jquery to scrape websites

任何人有什麼想法?

+0

我覺得你的第二個鏈接回答你自己的問題 – 2011-03-07 02:24:21

+0

@sirhc - node.io看起來像_exactly_我​​在找什麼...謝謝! – Avishai 2011-03-12 15:22:20

+19

作爲node.io的作者我可以爲此保證;) – chriso 2011-03-31 05:29:27

回答

24

Node.io似乎要把蛋糕:-)

+15

作爲作者,我可以爲node.io保證;) – chriso 2011-03-31 05:27:55

+2

Node.io不再被維護。它已經死了,原來的域名被出售了。這個答案不是最新的。 – 2016-05-31 17:21:55

1

你並不總是需要jQuery的。例如,如果您使用從jsdom返回的DOM進行遊戲,則可以輕鬆地自行獲取所需內容(同時考慮到您不必擔心xbrowser問題。)請參閱:https://gist.github.com/1335009,它完全沒有從node.io中移除,只是說您可能會能夠自己做...

5

所有上述解決方案假定本地運行scraper。這意味着你的性能會受到嚴重限制(由於它們按順序或在一組有限的線程中運行)。一個更好的方法是,依靠現有的,儘管商業化的刮板網格。

下面是一個例子:

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]]); 
}); 

這裏,刮遠程執行,回調是發給你的代碼只有當結果準備就緒(也有收集的結果,因爲他們成爲可用的選項)。

您可以在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),但值得一看任何感興趣的人。

1

使用ES7 /承諾

通常情況下,新的方式,當你刮你想用一些方法來

  1. 獲取資源上的Web服務器(通常爲html文件)
  2. 閱讀該資源並使用它作爲
    1. 一個DOM /樹結構,並使其可導航
    2. 解析它爲標記文檔與類似SAS的東西。

兩個樹,和令牌解析具有優勢,但樹是通常簡單得多。我們會這樣做。退房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 

這是使用cheerio基本上是一個輕量級的服務器端的jQuery式的圖書館(即不需要窗口對象,或jsdom)。

因爲您使用的是承諾,您還可以在異步函數中編寫它。它會看起來同步,但它會是異步的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等等,但是一旦你的地步,你需要解析和執行JavaScript(ala SPA和更多),然後我會檢查出https://github.com/joelgriffith/navalia(我是作者)。 Navalia的構建是爲了支持在無頭瀏覽器中進行搜索,而且速度非常快。謝謝!