Как выполнить фоновую загрузку и очистку страницы с расширением XUL / Firefox - PullRequest
6 голосов
/ 27 декабря 2008

Я хочу поцарапать пользовательские страницы SO, чтобы предоставить владельцам моей панели инструментов обновленную информацию по своим вопросам / ответам / и т. Д. *

Это означает, что мне нужно сделать это в фоновом режиме, проанализировать страницы, извлечь содержимое, сравнить его с последним запуском и затем представить результаты либо на панели инструментов, либо в строке состояния, либо, альтернативно, во всплывающем окне. окно какое-то. И все это должно быть сделано, пока пользователь занимается своими делами, не прерываясь и даже не работая на SO.

Я довольно тщательно искал как в Google, так и в Mozilla Wiki какой-то намек. Я даже дошел до того, что скачал несколько других расширений, которые, я думаю, делают то же самое. К сожалению, у меня не было времени, чтобы просмотреть все из них, и те, на которые я смотрел, используют API данных (Services, WebServices, XML), а не html scrapping.

Старый текст вопроса

Я ищу хорошее место, чтобы узнать, как я могу загрузить страницу внутри функции с именем buy the disamous set_timeout () для обработки скриншота в фоновом режиме.

Моя идея - представить результаты такого анализа в расширении строки состояния, на случай, если что-то изменится с последнего запуска.

Есть ли скрытый оверлей или какая-то другая отговорка?

Ответы [ 4 ]

6 голосов
/ 11 января 2009

В случае 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(), вероятно, должен работать.

Edit:

  1. См. Пример здесь (см. Раздел Загрузка изображений ) для примера о том, как собрать загруженные данные в одну переменную; и
  2. См. на этой странице о том, как преобразовать источник HTML в дерево DOM.

НТН.

3 голосов
/ 27 декабря 2008

Я не уверен, что полностью понял вопрос, но постараюсь ответить на несколько очевидных альтернативных вопросов:

Если вы ищете статическую очистку веб-страницы BeautifulSoup (Python) - один из лучших и простых.

Если вы ищете изменения на странице на основе Ajax, которые со временем меняются, вам придется продолжать выполнять код в бесконечном цикле. Но не опрашивайте сайт слишком часто, он обнаружит потребление пропускной способности и может заблокировать ваш IP, поэтому опрашивайте через некоторый интервал.

Если вы хотите отсканировать некоторые тикеры, отображаемые на JavaScript, или что-то подобное, это невозможно сделать, пока страница не будет отрисована, и, следовательно, это невозможно только с BeautifulSoup. вам придется использовать безголовый браузер, такой как Crowbar - Similie (использует XULRunner), который отображает содержимое javascript в безголовом браузере, а выходные данные этого визуализированного содержимого можно использовать как вход для скребка BeautifulSoup.

1 голос
/ 27 декабря 2008

Из привилегированного JavaScript, т.е. JS в расширении, вы можете создавать скрытые iframe s; загрузка указанной страницы так же проста, как установка местоположения в этом фрейме.

Если вы перетягиваете свою простую статическую страницу, которой вы владеете, set_timeout будет в порядке. Но в таком случае, почему бы не использовать XHR?

Если вы перетаскиваете произвольные страницы, содержащие динамические элементы или большое количество контента, я бы рекомендовал вместо этого запустить очистку страницы, используя Document.onload обработчики событий. Это намного более надежно, и вы можете научиться очищать страницу в кратчайшие сроки, но когда вы знаете, что необходимый контент уже есть.

Я не думаю, что есть конкретное руководство по этому вопросу, но Mozilla Developer Center , который, я уверен, вы уже нашли, абсолютно превосходен - лучшая техническая документация онлайн на мой взгляд !

0 голосов
/ 08 января 2009

Взгляните на XMLHttpRequest , следует начать.

...