掃除機またはスマートなFirefoxの車輪の後ろ

リンク自体に従うブラウザは、タブを開いたり閉じたり、すべてのコンテンツをファイルシステムに解析または保存します。これを見るのは面白いですね。 個人的には、そのようなものを作成することに興味がありました。 フィクションはありません! 一般的に、もう一度、インスピレーションのプログラマーの怠inessさのようなものが私に目を覚まし、PHP、PerlまたはRubyで通常のクローラー(スパイダーまたは単にウェブサイトパーサー)を書く代わりに、私はFireFoxでそれを行う方法を見つけ始めました。



準備する



これをすべて行うには、XUL DOMにアクセスできるJavaScriptコンソールが必要でした。 ブラウザウィンドウの右下隅にアイコンを追加するFireFox用の非常に簡単な拡張機能を作成しました



画像



このアイコンをクリックすると、JavaScriptコードを記述し、ブラウザー要素を管理できるウィンドウが開きます。 拡張機能はここからダウンロードできます

スクリプトを実行するには、CTRL + Enterを押します(テキストボックス要素にフォーカスがあります)。



戦車にいる人のために



すべてのプログラマーがFireFox自体のJavaScriptオブジェクトに精通しているわけではないので、ちょっとした理論が役立つと思います。 HTMLと同様に、「最高のプレイヤー」はウィンドウとドキュメントです。 コンテンツ(HTML DOM)にアクセスするには、このように書く必要があります

var links = window.content. document .getElementsByTagName( 'a' );

// or just

var links = content. document .querySelectorAll( 'a' );

alert(links.length)




* This source code was highlighted with Source Code Highlighter .









var links = window.content. document .getElementsByTagName( 'a' );

// or just

var links = content. document .querySelectorAll( 'a' );

alert(links.length)




* This source code was highlighted with Source Code Highlighter .









var links = window.content. document .getElementsByTagName( 'a' );

// or just

var links = content. document .querySelectorAll( 'a' );

alert(links.length)




* This source code was highlighted with Source Code Highlighter .












もう1つの非常に重要なポイントは、HTML DOMの読み込みの瞬間をキャッチする方法、およびタブとブラウザーを操作する方法です。 tabbrowser要素にアクセスするには、グローバル変数gBrowserを使用できます。 この要素を使用すると、タブを操作できます。 いくつかの例

// add new tab

var tab = gBrowser.addTab( 'http://habrahabr.ru' );

gBrowser.selectedTab = tab;



// get browser element for tab

var browser = gBrowser.getBrowserForTab(tab);



// add listeners on page load

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

// listener implementation

}, false );



// add listeners on HTML DOM loaded

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

if ( event .originalTarget instanceof HTMLDocument) {

var document = event .originalTarget;

// listener implementation

}

}, false );


* This source code was highlighted with Source Code Highlighter .









// add new tab

var tab = gBrowser.addTab( 'http://habrahabr.ru' );

gBrowser.selectedTab = tab;



// get browser element for tab

var browser = gBrowser.getBrowserForTab(tab);



// add listeners on page load

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

// listener implementation

}, false );



// add listeners on HTML DOM loaded

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

if ( event .originalTarget instanceof HTMLDocument) {

var document = event .originalTarget;

// listener implementation

}

}, false );


* This source code was highlighted with Source Code Highlighter .









// add new tab

var tab = gBrowser.addTab( 'http://habrahabr.ru' );

gBrowser.selectedTab = tab;



// get browser element for tab

var browser = gBrowser.getBrowserForTab(tab);



// add listeners on page load

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

// listener implementation

}, false );



// add listeners on HTML DOM loaded

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

if ( event .originalTarget instanceof HTMLDocument) {

var document = event .originalTarget;

// listener implementation

}

}, false );


* This source code was highlighted with Source Code Highlighter .












また、Webページをファイルに保存する方法を学ぶことも役立つと思います。

var tab = gBrowser.addTab( 'http://habrahabr.ru' );

gBrowser.selectedTab = tab;

var browser = gBrowser.getBrowserForTab(tab);

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

var document = event .originalTarget;

if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {

var basename = document .location.href.replace(/\/+$/, '' ),

pos = basename.lastIndexOf( '/' );

if (pos != -1) {

basename = basename.substr(pos+1);

}



var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);

file.initWithPath( '/tmp/' +basename);

if (!file.exists()) {

var chosen = new AutoChosen(file, makeFileURI(file));

internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);

}

}

}, false )


* This source code was highlighted with Source Code Highlighter .









var tab = gBrowser.addTab( 'http://habrahabr.ru' );

gBrowser.selectedTab = tab;

var browser = gBrowser.getBrowserForTab(tab);

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

var document = event .originalTarget;

if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {

var basename = document .location.href.replace(/\/+$/, '' ),

pos = basename.lastIndexOf( '/' );

if (pos != -1) {

basename = basename.substr(pos+1);

}



var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);

file.initWithPath( '/tmp/' +basename);

if (!file.exists()) {

var chosen = new AutoChosen(file, makeFileURI(file));

internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);

}

}

}, false )


* This source code was highlighted with Source Code Highlighter .









var tab = gBrowser.addTab( 'http://habrahabr.ru' );

gBrowser.selectedTab = tab;

var browser = gBrowser.getBrowserForTab(tab);

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

var document = event .originalTarget;

if ( document instanceof HTMLDocument && this .contentWindow. document == document ) {

var basename = document .location.href.replace(/\/+$/, '' ),

pos = basename.lastIndexOf( '/' );

if (pos != -1) {

basename = basename.substr(pos+1);

}



var file = Components.classes[ "@mozilla.org/file/local;1" ].createInstance(Components.interfaces.nsILocalFile);

file.initWithPath( '/tmp/' +basename);

if (!file.exists()) {

var chosen = new AutoChosen(file, makeFileURI(file));

internalSave( document .location.href, document , null , null , document .contentType, false , null , chosen);

}

}

}, false )


* This source code was highlighted with Source Code Highlighter .












追加の条件this.contentWindow.document == documentは、ページにiframe要素があり、フレームからではなく、必要なページを1回だけ保存する必要がある場合に状況をフィルタリングします。

internalSave関数(ファイルを保存)およびAutoChosenクラス(ユーザーによるファイルの選択をエミュレートすると理解しているため)については、 ソースコードのコメントを読むことができますここでファイルを操作するその他の例。



FireFoxをトレーニングします



FireFoxに特定のユーザーとしてHabrにログインするように指示するスクリプトを作成します。

var Crawler = {

habrahabr: function (username, password) {

this .username = username;

this .password = password;

},

onHTMLLoaded: function (browser, callback) {

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

var document = event .originalTarget;

if ( document instanceof HTMLDocument

&& this .contentWindow. document == document

) {

this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );

callback.call( this , event , document );

}

}, false );

return browser;

}

}



Crawler.habrahabr.prototype = {

url: 'http://habrahabr.ru/' ,

openAndSignIn: function (inNewTab) {

var tab = gBrowser.selectedTab, browser = null ;

if (inNewTab) {

tab = gBrowser.addTab( this .url);

} else {

content. document .location = this .url;

}

browser = gBrowser.getBrowserForTab(tab);

var that = this ;

Crawler.onHTMLLoaded(browser, function ( event , document ){

document .location = document .querySelector( 'dl.panel-personal a' ).href;

Crawler.onHTMLLoaded( this , function ( event , document ){

var user = document .getElementById( 'reg-f-username' );

user.value = that.username;

document .getElementById( 'reg-f-password' ).value = that.password;

user.form.querySelector( 'input[type="submit"]' ).click();

});

});

}

};

var cr = new Crawler.habrahabr( 'serjoga' , '***' );

cr.openAndSignIn( true );




* This source code was highlighted with Source Code Highlighter .









var Crawler = {

habrahabr: function (username, password) {

this .username = username;

this .password = password;

},

onHTMLLoaded: function (browser, callback) {

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

var document = event .originalTarget;

if ( document instanceof HTMLDocument

&& this .contentWindow. document == document

) {

this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );

callback.call( this , event , document );

}

}, false );

return browser;

}

}



Crawler.habrahabr.prototype = {

url: 'http://habrahabr.ru/' ,

openAndSignIn: function (inNewTab) {

var tab = gBrowser.selectedTab, browser = null ;

if (inNewTab) {

tab = gBrowser.addTab( this .url);

} else {

content. document .location = this .url;

}

browser = gBrowser.getBrowserForTab(tab);

var that = this ;

Crawler.onHTMLLoaded(browser, function ( event , document ){

document .location = document .querySelector( 'dl.panel-personal a' ).href;

Crawler.onHTMLLoaded( this , function ( event , document ){

var user = document .getElementById( 'reg-f-username' );

user.value = that.username;

document .getElementById( 'reg-f-password' ).value = that.password;

user.form.querySelector( 'input[type="submit"]' ).click();

});

});

}

};

var cr = new Crawler.habrahabr( 'serjoga' , '***' );

cr.openAndSignIn( true );




* This source code was highlighted with Source Code Highlighter .









var Crawler = {

habrahabr: function (username, password) {

this .username = username;

this .password = password;

},

onHTMLLoaded: function (browser, callback) {

browser.addEventListener( 'DOMContentLoaded' , function ( event ){

var document = event .originalTarget;

if ( document instanceof HTMLDocument

&& this .contentWindow. document == document

) {

this .removeEventListener( 'DOMContentLoaded' , arguments.callee, false );

callback.call( this , event , document );

}

}, false );

return browser;

}

}



Crawler.habrahabr.prototype = {

url: 'http://habrahabr.ru/' ,

openAndSignIn: function (inNewTab) {

var tab = gBrowser.selectedTab, browser = null ;

if (inNewTab) {

tab = gBrowser.addTab( this .url);

} else {

content. document .location = this .url;

}

browser = gBrowser.getBrowserForTab(tab);

var that = this ;

Crawler.onHTMLLoaded(browser, function ( event , document ){

document .location = document .querySelector( 'dl.panel-personal a' ).href;

Crawler.onHTMLLoaded( this , function ( event , document ){

var user = document .getElementById( 'reg-f-username' );

user.value = that.username;

document .getElementById( 'reg-f-password' ).value = that.password;

user.form.querySelector( 'input[type="submit"]' ).click();

});

});

}

};

var cr = new Crawler.habrahabr( 'serjoga' , '***' );

cr.openAndSignIn( true );




* This source code was highlighted with Source Code Highlighter .












まず、Crawlerオブジェクトを作成し、そこに新しいパーサーを追加できます。 ユーザー名とパスワードを渡すhabrahabrパーサーのコンストラクターを作成します。 habrahabrオブジェクトのプロトタイプにopenAndSignInメソッドを追加します。 このメソッドは、Habrを開いて、特定のユーザーの下で認証することができます。



PS:たくさんのボタンをクリックして2つのサイトでも10ページを閲覧する必要がある場合、バグのテストケースの再生を自動化することがよくあります。



All Articles