使用 Node.js 抓取网站内容是一件好事。我想构建一个非常非常快的东西,可以以 kayak.com 的风格执行搜索,其中一个查询被分派到几个不同的站点,抓取结果,并在可用时返回给客户端。
假设这个脚本应该只提供 JSON 格式的结果,我们可以直接在浏览器或另一个 Web 应用程序中处理它们。
一些出发点:
大家有什么想法吗?
Node.io 似乎占据了蛋糕 :-)
所有上述解决方案都假定在本地运行爬虫。这意味着您的性能将受到严重限制(由于按顺序运行它们或在有限的线程集中运行它们)。恕我直言,更好的方法是依赖现有的(尽管是商业的)抓取网格。
这是一个例子:
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 下载 Bobik 客户端代理 SDK
我自己一直在做研究,https://npmjs.org/package/wscraper自诩为
基于 Cheerio.js 的网络抓取代理,快速、灵活且精益 核心 jQuery 的实现;构建在 request.js 之上;受到启发 http-agent.js
使用率非常低(根据 npmjs.org),但值得任何感兴趣的各方看看。
您并不总是需要 jQuery。例如,如果您使用从 jsdom 返回的 DOM,您可以轻松地自己获取所需的内容(同时考虑到您不必担心 xbrowser 问题。)请参阅:https://gist.github.com/1335009 这不是采取完全远离node.io,只是说你也许可以自己做,具体取决于......
通常当你刮的时候你想用一些方法来
树和标记解析都有优点,但树“通常”要简单得多。我们会这么做的。查看 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)。 因为您使用的是 Promise,所以您也可以将其编写在异步函数中。它看起来是同步的,但与 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>
}
javascript-rendered website
,那么你必须使用像木偶师这样的东西,它可以像真正的访客一样模拟某些动作。您可以阅读这篇文章,其中重点介绍了
使用 Puppeteer 与 Cheerio在 javascript 中抓取网站之间的差异。希望有帮助!
我以前从未在 Javascript 上运行过多线程任务,但这似乎很有可能!