我正在尝试使用 TamperMonkey/Javascript/jQuery 从单个站点“抓取”一小部分数据,并将其整理到单个页面上。
我编写了一个 TM 脚本(当我打开目标页面时触发)来执行以下操作:
- 在页面中搜索某种类型的链接(通常大约 8 个) 链接)
- “关注”找到的每个链接到新页面,找到并关注其中的单个链接
- 提取我感兴趣的数据并将其“合并”到 我打开的原始页面。
迭代这些操作通常会导致站点触发 16 个(8 * 2 个链接)HTTP 请求。如果我手动调用它(通过控制台)以单步方式对所有 16 条数据执行操作,我编写的代码可以正常工作。
但是,如果我尝试设置一个循环并让代码“做它的事情”,我会得到 您请求的页面没有响应 type HTML back (状态 = OK)大约 4 次迭代后。我猜测该网站正在保护自己免受某种 XSRF 攻击,或者只是速度确实很慢?
我的问题是,降低我从网站请求数据的速率的首选技术是什么?我考虑过构建一个要处理的 HTTP 函数调用或 URL 数组,但这看起来很笨拙,有什么更惯用的方法可供我使用吗?
我猜这肯定是一个常见问题,并且存在可靠的解决方案,但我只是对术语没有足够的掌握来正确搜索它。
最佳答案
我在另一个问题上发布的类似答案:Browser stops working for a while after synchronous ajax call in a for loop
您可以使用“递归”函数来帮助您控制异步调用的流程。您可以异步运行它们,并在下一个运行时运行该函数,而不是同步运行。
类似于:
function doCall() {
setTimeout(function() {
$.ajax({
//...
succcess: function(data) {
//...
//time to start the next one
doCall();
},
error: function() {
//call the next one on error?
doCallI();
}
});
}, 1000); //1 second wait before each run
}
这样他们就可以异步运行,在调用时不会阻塞所有内容;但仍然串联运行。您甚至可以在 doCall 函数中放置一个小的延迟,以便有一些空间。
关于javascript - JS/jQuery 中 'pacing' HTTP 请求的首选技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15786621/