使用Node.js抓取網站內容是一件好事。我想要構建一些速度非常快,可以執行kayak.com風格的搜索,其中一個查詢被分派到幾個不同的站點,結果被刮掉,並在客戶端變得可用時返回給客戶端。使用Node.js實時刮取網頁
我們假設這個腳本應該只提供JSON格式的結果,我們可以直接在瀏覽器或其他Web應用程序中處理它們。
一些出發點:
Using node.js and jquery to scrape websites
任何人有什麼想法?
使用Node.js抓取網站內容是一件好事。我想要構建一些速度非常快,可以執行kayak.com風格的搜索,其中一個查詢被分派到幾個不同的站點,結果被刮掉,並在客戶端變得可用時返回給客戶端。使用Node.js實時刮取網頁
我們假設這個腳本應該只提供JSON格式的結果,我們可以直接在瀏覽器或其他Web應用程序中處理它們。
一些出發點:
Using node.js and jquery to scrape websites
任何人有什麼想法?
你並不總是需要jQuery的。例如,如果您使用從jsdom返回的DOM進行遊戲,則可以輕鬆地自行獲取所需內容(同時考慮到您不必擔心xbrowser問題。)請參閱:https://gist.github.com/1335009,它完全沒有從node.io中移除,只是說您可能會能夠自己做...
所有上述解決方案假定本地運行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]]);
});
這裏,刮遠程執行,回調是發給你的代碼只有當結果準備就緒(也有收集的結果,因爲他們成爲可用的選項)。
我一直在做自己的研究下載Bobik client proxy SDK,並https://npmjs.org/package/wscraper擁有自己基於cheerio.js一個
網絡刮刀劑快速,靈活,和瘦 實現核心jQuery;建立在request.js之上;靈感來自 http-agent.js
使用率很低(根據npmjs.org),但值得一看任何感興趣的人。
這是我易於使用的通用刮板https://github.com/harish2704/html-scrapper寫爲Node.JS 它可以提取基於預定義模式的信息。 模式定義包括一個css選擇器和一個數據提取功能。 它目前使用cheerio進行dom解析..
退房https://github.com/rc0x03/node-promise-parser
Fast: uses libxml C bindings
Lightweight: no dependencies like jQuery, cheerio, or jsdom
Clean: promise based interface- no more nested callbacks
Flexible: supports both CSS and XPath selectors
通常情況下,新的方式,當你刮你想用一些方法來
兩個樹,和令牌解析具有優勢,但樹是通常簡單得多。我們會這樣做。退房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>
}
我看到的大多數回答正確的道路與cheerio
等等,但是一旦你的地步,你需要解析和執行JavaScript(ala SPA和更多),然後我會檢查出https://github.com/joelgriffith/navalia(我是作者)。 Navalia的構建是爲了支持在無頭瀏覽器中進行搜索,而且速度非常快。謝謝!
我覺得你的第二個鏈接回答你自己的問題 – 2011-03-07 02:24:21
@sirhc - node.io看起來像_exactly_我在找什麼...謝謝! – Avishai 2011-03-12 15:22:20
作爲node.io的作者我可以爲此保證;) – chriso 2011-03-31 05:29:27