javascript - JS/jQuery 中 'pacing' HTTP 请求的首选技术?

标签 javascript ajax csrf web-crawler

我正在尝试使用 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/

相关文章:

javascript - 为什么我的 require.js 配置中的 shim `init` 没有被调用?

javascript - Vue.js 似乎没有在变量更改时更新 DOM

javascript - 如何构建用户名验证器

php - 访问 Jquery/AJAX 发送的 $_POST 数据

javascript - Ember.js ember-data 和跨域 ajax 请求

Ajax Thymeleaf Springboot

javascript - 带有csrf token 的Angular SpringBoot SpringSecurity应用程序Ajax POST在未定义 token /头时失败

javascript - 拖放元素以创建 html 输入

javascript - 使用 React 进行分页,解决 JSON 数据问题

security - 新标签页和浏览器窗口中的 CSRF token