【发布时间】:2025-12-16 07:55:02
【问题描述】:
我有一个经过逆向工程的 API 端点。我用它来搜索名称,它在一次请求中返回不超过 100 个实体。但是我想要获取这些实体中的大约 130 万个以上。
这是来自响应的实体示例:
{
"name":"COMPANY NAME",
"regNo":"100-H",
"newRegNo":"191101000018",
"type":"Company"
}
我可以通过name 或regNo 进行搜索。搜索没有最小字符限制。我想过按字母顺序搜索,但由于它一次返回不超过 100 个实体,我无法获取其余实体。所以,我尝试通过regNo 获取它。 regNo 可以从 1 到 1000000。
这是我编写的通过regNo 获取所有实体的脚本:
const test = async () => {
const data = {};
try {
const requests = [];
// since it returns no more than 100 entities at once it adds 100
// to the search query on every loop
for (let i = 100; i < 10000; i += 100) {
requests.push(fetchData(i));
}
const result = await Promise.all(requests);
result.forEach(res => {
res.entityList.forEach(entity => {
data[entity.regNo] = entity;
});
});
// You can ignore this part
fs.writeFile("data.json", JSON.stringify(data), err => {
console.log(err);
});
console.log(Object.keys(data).length);
} catch (err) {
console.log(err);
}
};
获取 9100 个实体大约需要 15 秒(进行了 100 个循环)
而且每个regNo都有一个像11000-H这样的字母后缀
如果我获取 100,它将返回如下内容:
entityList: [
{
name: "COMPANY NAME",
regNo: '100-H',
newRegNo: '191101000018',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '1000-V',
newRegNo: '193901000021',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '10000-T',
newRegNo: '197001000604',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '100000-D',
newRegNo: '198301004377',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '1000001-W',
newRegNo: '201001012078',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '1000002-K',
newRegNo: null,
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '1000003-U',
newRegNo: '201001012079',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '1000004-V',
newRegNo: '201001012080',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '1000005-D',
newRegNo: '201001012081',
type: 'Company'
},
{
name: "COMPANY NAME",
regNo: '1000006-A',
newRegNo: '201001012082',
type: 'Company'
},
.......
如您所见,它不会返回从 0 到 99 的实体。我假设最高的 regNo 是 1000000-suffixLetter,如果我可以在循环中从 100 获取到 1000000,我将获取大约 100 万个实体。但是这里的技巧regNo 有一个后缀字母。假设如果我获取 100,它会从 100-A 返回到 199-A。但还有其他实体,如100-B、100-C 等
如何在不丢失数据的情况下高效地获取 130 万多个实体?
【问题讨论】:
-
如果这是一次性操作,那么您使用的方法有什么问题?
-
效率是否与推测可能探测没有条目的查询(因此毫无价值但不可避免的努力)有关,或者正如 Patrick87 所指的那样,与运行的探测次数的性能有关?
-
fetchData(100)是否返回从 0 到 99 的所有regNo实体? -
@Ben 谢谢你的回复。我更新了问题以使其更清楚。请看一下)
-
您需要枚举
regNos 的所有可能组。对于它们中的每一个,您都需要进行 API 调用并将结果附加到数据结构(或文件或数据库)中。您需要考虑避免在服务器上触发拒绝服务保护,因此将调用速率限制为在任何时候(例如)有 10 个请求在进行中。对于当前信息,这是我能提供的最好帮助。
标签: javascript database algorithm sorting fetch