2008-12-27 10 views
6

Chcę zeskrobać strony użytkownika SO, aby dać właścicielom mojego paska narzędzi zaktualizowane informacje na temat ich pytań/odpowiedzi/etc ...Jak wykonać ładowanie tła i skrobanie strony z rozszerzeniem XUL/Firefox

Oznacza to, że muszę to zrobić w tle, przeanalizować strony, wyodrębnić zawartość, porównać ją z ostatnim przebiegiem, a następnie przedstawić wyniki na pasku narzędzi lub pasku stanu, lub alternatywnie w wyskakującym oknie jakiegoś rodzaju. I wszystko to musi być zrobione, gdy użytkownik nie chce przerwać pracy, a nawet być na SO.

Szukałem dość dokładnie zarówno w Google jak i na Wiki Mozilli dla jakiejś podpowiedzi. Doszedłem nawet do tego, że pobierałem kilka innych rozszerzeń, które myślę, że robią to samo. Niestety nie miałem czasu, aby przejść przez wszystkie z nich i te, na które patrzyłem, wszystkie wykorzystują API danych (usługi, WebServices, XML), a nie złomowanie html.

Old pytanie tekst

szukam ładne miejsce, aby dowiedzieć się w jaki sposób można załadować stronę wewnątrz funkcji zwanej kupić niesławnego set_timeout(), aby przetworzyć ekran skrobaniu w tle.

Mój pomysł polega na przedstawieniu wyników takiego skrobania w rozszerzeniu paska stanu, na wypadek gdyby coś zmieniło się od ostatniego uruchomienia.

Czy jest ukryta nakładka lub inna podstęp?

Odpowiedz

6

W przypadku XUL/Firefox, co potrzebne jest interfejs nsIIOService, które można uzyskać w ten sposób:

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

Następnie trzeba utworzyć kanał i otwórz asynchronicznego link:

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

kluczem tutaj jest przedmiotem 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; } 
    }; 
} 

masz do wypełniania szczegółów w funkcjach onStartRequest, onStopRequest, onDataAvailable, ale to powinno wystarczyć. Możesz zobaczyć jak użyłem tego interfejsu w moim rozszerzeniu Firefox (nazywa się to IdentFavIcon i można go znaleźć na stronie z dodatkami do Mozilli).

Częścią, której nie jestem pewien, jest to, że od czasu do czasu można wywołać to żądanie strony, prawdopodobnie prawdopodobnie zadziała set_timeout().

Edit:

  1. Zobacz przykład here (patrz punkt Pobieranie obrazów) na przykład o tym, jak zebrać pobranych danych do pojedynczej zmiennej; i
  2. Zobacz, jak przekonwertować źródło HTML na drzewo DOM.

HTH.

+0

czy powstała "strona" może zostać użyta jako obiekt DOM? –

+0

Próbowałem odpowiedzieć na to w mojej edycji. –

1

Z uprzywilejowanego JavaScriptu, tj. JS w rozszerzeniu, można tworzyć ukryte iframe s; pobranie określonej strony jest tak proste jak ustawienie lokalizacji w tej ramce.

Jeśli usuniesz prostą, statyczną stronę, którą posiadasz, powinna być w porządku. Ale w takim wypadku, dlaczego nie skorzystać z XHR?

Jeśli usuwasz dowolne strony, zawierające dynamiczne elementy lub dużą ilość treści, to zamiast tego zalecam wywołanie zeskrobania strony przy użyciu programów obsługi zdarzeń Document.onload. Jest bardziej niezawodny i możesz uzyskać sprytne informacje na temat skrobania strony w najwcześniejszym możliwym momencie, ale gdy wiesz, że wymagana zawartość jest dostępna.

Nie sądzę, że istnieje specjalny tutorial na ten temat, ale Mozilla Developer Center, który na pewno już znalazłeś, jest absolutnie doskonały - najlepsza internetowa dokumentacja techniczna w mojej opinii!

+0

Czy XHR na zezwoleniu na rozszerzenie ma dostęp do innych domen? Czy mogę korzystać z urządzeń Firefox DOM w HTML pobranych z XHR. –

3

Nie jestem pewien, czy dobrze zrozumiałem pytanie całkowicie, ale postaram się odpowiedzieć na kilka oczywistych alternatywne pytania:

Jeśli szukasz statycznej strony internetowej zgarniania BeautifulSoup (Python) jest jednym z najlepszych i najłatwiejszych .

Jeśli szukasz zmiany na stronie opartej na Ajax, która zmienia się z biegiem czasu, będziesz musiał nadal uruchamiać kod w nieskończonej pętli. Ale nie należy zbyt często odpytywać strony, wykryje ona zużycie przepustowości i może zablokować twój adres IP, więc odpytaj w pewnym odstępie czasu.

Jeśli chcesz skasować niektóre paski renderowane javascript lub coś takiego, nie da się tego zrobić, dopóki strona nie zostanie wyrenderowana, dlatego nie jest to możliwe w przypadku samej aplikacji BeautifulSoup. będziesz musiał użyć przeglądarki bez nagłówka, takiej jak Crowbar - Similie (używa XULRunnera), która renderuje zawartość javascript w przeglądarce bezgłowej, a wynik tej renderowanej treści może być wykorzystany jako dane wejściowe do skrobaka BeautifulSoup.

+0

Muszę to zrobić na pasku narzędzi, który jest rozszerzeniem przeglądarki Firefox. Zobacz moje wyjaśnienie. –