【问题标题】:Scrape / eavesdrop AJAX data using JavaScript?使用 JavaScript 抓取/窃听 AJAX 数据?
【发布时间】:2012-11-25 17:54:26
【问题描述】:

是否可以使用 JavaScript 抓取正在使用 AJAX 实时更新的网页的所有更改?我希望每秒使用 AJAX 抓取更新数据的站点,我想获取所有更改。这是一个拍卖网站,只要用户出价,就会有几个对象发生变化。出价时会发生以下变化:

当前买入价 目前的高出价者 拍卖计时器已加回时间

我希望使用基于 JavaScript 的 Chrome 扩展来获取这些数据。是否有 JavaScript 的 AJAX 侦听器可以完成此操作?工具包?我需要一些方向。 JavaScript 能做到这一点吗?

【问题讨论】:

    标签: javascript ajax google-chrome-extension hook scrape


    【解决方案1】:

    我将展示两种解决问题的方法。无论您选择哪种方法,都不要忘记阅读我的答案的底部!

    首先,我提出一个简单的方法,只有在页面使用 jQuery 时才有效。第二种方法看起来稍微复杂一些,但也适用于没有 jQuery 的页面。

    以下示例展示了如何实现基于方法(例如 POST/GET)、URL 以及读取 (POST) 数据和响应主体的过滤器。

    在 jQuery 中使用全局 ajax 事件

    关于 jQuery 方法的更多信息可以在.ajaxSuccess 的文档中找到。 用法:

    jQuery.ajaxSuccess(function(event, xhr, ajaxOptions) {
        /* Method        */ ajaxOptions.type
        /* URL           */ ajaxOptions.url
        /* Response body */ xhr.responseText
        /* Request body  */ ajaxOptions.data
    });
    

    纯 JavaScript 方式

    当网站的 AJAX 请求不使用 jQuery 时,您必须修改内置的 XMLHttpRequest 方法。这需要更多代码...:

    (function() {
        var XHR = XMLHttpRequest.prototype;
        // Remember references to original methods
        var open = XHR.open;
        var send = XHR.send;
    
        // Overwrite native methods
        // Collect data: 
        XHR.open = function(method, url) {
            this._method = method;
            this._url = url;
            return open.apply(this, arguments);
        };
    
        // Implement "ajaxSuccess" functionality
        XHR.send = function(postData) {
            this.addEventListener('load', function() {
                /* Method        */ this._method
                /* URL           */ this._url
                /* Response body */ this.responseText
                /* Request body  */ postData
            });
            return send.apply(this, arguments);
        };
    })();
    

    让它在 Chrome 扩展程序中工作

    前面显示的代码必须在页面的上下文中运行(在您的情况下,是拍卖页面)。因此,必须使用content script注入 (!) 脚本。使用它并不难,我参考这个答案以获得详细解释和使用示例:Building a Chrome Extension - Inject code in a page using a Content script

    一般方法

    您可以使用chrome.webRequest API 读取请求正文、请求标头和响应标头。标题也可以修改。然而,它(还)不能读取,更不用说修改请求的响应正文了。如果你想要这个功能,star https://code.google.com/p/chromium/issues/detail?id=104058

    【讨论】:

    • 如果您想与您的 Chrome 扩展程序的内容脚本和/或背景页面共享捕获的 XHR 数据,请参阅Call background function of Chrome extension from a site
    • 这些代码 sn-ps 似乎都不适合我(在 chrome 扩展中)。有人让它工作吗?
    • @K2xL 你把sn-p放在哪里了?必须在内容脚本注入的脚本中使用。
    • Rob:我把它放在内容脚本中。似乎内容脚本在它们自己的沙箱上运行,因此您无法通过它们覆盖 XHR 对象:-(
    • 我不断收到ajaxSuccess is not a function Then I read the docs "从 jQuery 1.9 开始,jQuery 全局 Ajax 事件的所有处理程序,包括使用 .ajaxSuccess() 方法添加的处理程序,都必须附加到文档。 "所以对于 1.9 > 你必须这样做 $(document).ajaxSuccess(function(event, xhr, ajaxOptions) { .....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多