如何使用MongoDB中的foreach方法进行抓取/ API调用而不会被网站列入黑名单?

时间:2015-05-07 03:46:05

标签: node.js web-scraping

我目前在我的收藏中有大约20个文件(而且我计划在100多个文档中添加更多文档)。我正在使用MongoDB Node.js客户端collection.foreach()方法迭代每个方法,并根据文档记录转到3个不同的端点:两个API(沃尔玛和亚马逊)和一个网站刮(名称不相关)。每个文档都包含执行请求的相关数据,然后我使用返回的数据更新文档。

我遇到的问题是Walmart API,网站scrape不会在迭代结束时返回数据。或者至少我的数据库没有得到更新。我的假设是foreach方法触发了一堆同时发出的请求,要么我遇到端点允许的同时请求的任意限制,要么端点根本无法处理这么多请求而忽略任何超出其“请求能力”的东西。我已经运行了一些未通过相同代码更新的文档,但是在一个不同的集合中只包含一个文档并且它们确实更新了所以我认为它不是文档中的错误数据。

我在Heroku上运行它(并在本地进行测试)使用Node.js. Heroku实例和本地的结果都相似。

如果我的假设是正确的,我需要一种更好的方法来构造它,以便在请求之间存在一些分离,或者它只能在一次传递中执行x记录。

1 个答案:

答案 0 :(得分:1)

听起来您需要限制外发网络请求。有一个很棒的节点模块用于执行此操作,称为limiter。代码如下所示:

var RateLimiter = require('limiter').RateLimiter;

var limiter = new RateLimiter(1, 1000);
var throttledRequest = function() {
    limiter.removeTokens(1, function() {
        console.log('Only prints once per second');
    });
};

throttledRequest();
throttledRequest();
throttledRequest();