使用 Node.js 实时抓取网页
IT技术
javascript
jquery
node.js
screen-scraping
web-scraping
2021-03-14 16:34:39
6个回答
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玩你可以很容易地采取什么样的,你需要看到自己(也考虑到你没有浏览器之间的问题的担心。):https://gist.github.com/1335009这不是从带走根本没有node.io,只是说你可以自己做这取决于......
使用 ES7/promises 的新方法
通常当你刮你想使用一些方法
- 获取网络服务器上的资源(通常为 html 文档)
- 阅读该资源并将其作为
- DOM/树结构并使其可导航
- 使用 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-esque 库(不需要窗口对象或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>
}