6

我想抓取 SO 的用户页面,以向我的工具栏的所有者提供有关他们的问题/答案/等的更新信息......

这意味着我需要在后台执行此操作,解析页面,提取内容,将其与上次运行进行比较,然后将结果显示在工具栏或状态栏上,或者在某些弹出窗口上显示种类。所有这些都必须在用户进行他的业务时完成,而不会被打断甚至是在 SO 上。

我在 Google 和 Mozilla Wiki 上都进行了相当彻底的搜索,以寻找某种提示。我什至已经下载了一些我认为可以做同样的其他扩展。不幸的是,我没有时间浏览所有这些和我看过的那些,都使用数据 API(服务、WebServices、XML),而不是 html 报废。

旧问题文本

我正在寻找一个好地方来学习如何在一个名为购买臭名昭著的 set_timeout() 的函数中加载页面,以在后台处理屏幕抓取。

我的想法是在状态栏扩展中呈现这种抓取的结果,以防万一上次运行发生任何变化。

是否有隐藏的覆盖或其他一些诡计?

4

4 回答 4

6

对于 XUL/Firefox,您需要的是 nsIIOService 接口,您可以像这样获得它:

var mIOS = Components.classes["@mozilla.org/network/io-service;1"].
   getService(Components.interfaces.nsIIOService);

然后你需要创建一个通道,并打开一个异步链接:

var channel = mIOS.newChannel(urlToOpen, 0, null);
channel.asyncOpen(new StreamListener(), channel);

这里的关键是StreamListener对象:

var StreamListener = function() {
    return {
        QueryInterface: function(aIID) {
            if (aIID.equals(Components.interfaces.nsIStreamListener) ||
                aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
                aIID.equals(Components.interfaces.nsISupports))
                return this;
            throw Components.results.NS_NOINTERFACE;

        onStartRequest: function(aRequest, aContext)
           { return 0; },

        onStopRequest: function(aRequest, aChannel /* aContext */, aStatusCode)
           { return 9; },

        onDataAvailable: function(aRequest, aContext, aStream, aOffset, aCount)
           { return 0; }
    };
}

您必须在onStartRequest, onStopRequest,onDataAvailable函数中填写详细信息,但这应该足以让您继续前进。你可以看看我是如何在我的 Firefox 扩展中使用这个接口的(它被称为 IdentFavIcon,它可以在 mozilla 附加组件站点上找到)。

我不确定的部分是如何不时触发此页面请求 set_timeout(),但应该可以工作。

编辑:

  1. 有关如何将下载的数据收集到单个变量中的示例,请参见此处的示例(请参见下载图像部分);
  2. 请参阅此页面,了解如何将 HTML 源代码转换为 DOM 树。

HTH。

于 2009-01-10T21:16:04.863 回答
3

我不确定我是否完全理解了这个问题,但会尝试回答一些明显的替代问题:

如果您正在寻找静态网页抓取BeautifulSoup (Python) 是最好和最简单的方法之一。

如果您在基于 Ajax 的页面中寻找随时间变化的变化,您将不得不在无限循环中继续运行代码。但是不要太频繁地轮询站点,它会检​​测到带宽消耗并可能会阻塞您的 IP,因此请间隔一段时间进行轮询。

如果您要抓取一些 javascript 渲染的代码或其他内容,则在渲染页面之前无法完成,因此仅使用 BeautifulSoup 是不可能的。您将不得不使用像Crowbar - Similie(使用 XULRunner)这样的无头浏览器,它在无头浏览器上呈现 javascript 内容,并且该呈现内容的输出可以用作 BeautifulSoup 刮板的输入。

于 2008-12-27T18:16:00.867 回答
1

从特权JavaScript,即扩展中的JS,您可以创建隐藏iframe的s;下载指定页面就像在这个框架上设置位置一样简单。

如果您要拉下您拥有的简单静态页面,set_timeout应该没问题。但在那种情况下,为什么不使用 XHR 呢?

如果您要拉下任意页面,包含动态元素或大量内容的页面,我建议您使用Document.onload事件处理程序触发您对页面的抓取。它更可靠,并且您可以在尽可能早的时候巧妙地抓取页面,但是当您知道所需的内容在那里时。

我认为没有专门的教程,但我相信您已经找到了Mozilla 开发人员中心,它绝对是优秀的——我认为最好的在线技术文档!

于 2008-12-27T17:21:56.810 回答
0

看看XMLHttpRequest,应该可以帮助您入门。

于 2009-01-07T21:14:56.060 回答