我想抓取 SO 的用户页面,为我的工具栏所有者提供有关他们的问题/答案等的更新信息...
这意味着我需要在后台执行此操作,解析页面,提取内容,将其与上次运行进行比较,然后在工具栏或状态栏上显示结果,或者在弹出窗口上显示结果某种 window 。所有这一切都必须在用户处理自己的业务时完成,不能被中断,甚至不能处于开机状态。
我在 Google 和 Mozilla Wiki 上进行了相当彻底的搜索,以寻找某种提示。我什至还下载了一些其他扩展,我认为它们也能起到同样的作用。不幸的是,我没有时间仔细研究所有这些,而且我看过的所有这些都使用数据 API(服务、Web 服务、XML),而不是 html 报废。
旧问题文本
我正在寻找一个好地方来学习如何在名为购买臭名昭著的 set_timeout() 的函数中加载页面以在后台处理屏幕抓取。
我的想法是在状态栏扩展中显示此类抓取的结果,以防上次运行发生任何变化。
是否存在隐藏的叠加层或其他诡计?
最佳答案
对于 XUL/Firefox,您需要的是 nsIIOService 接口(interface),您可以这样获取:
var mIOS = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
然后需要创建一个 channel ,并打开一个异步链接:
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()
应该可以工作。
编辑:
HTH。
关于firefox - 如何使用 XUL/Firefox 扩展执行后台加载和抓取页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/395157/