Выкладываю куски, с описанием того где и как они будут использоваться в грабле, для тыра доменов с гугловой выдачи. Куски легко понять и применять для других изделий. Мотивы: Заметил что гугол нормально воспринимает тебя, когда ты за тором, если у тебя исполняются js и брозер уникальный, а не типовой торнутый. Парсить страницы удобней по DOM дереву. Грузить динамичекие страницы так же удобней брозером. Вместе с vnc можно эмитировать поведение пользователя. Вообщем много плюсов и один минус: Делать адон для лисицы - та ещё камасутра. Раньше я пользовался хромом, но однажды захотелось сохранить фильмец, а в нём это делать просто пипец. Запустил firefox и прям за две секунды вытянул урл( теперь у меня офлайн коллекция фильмов и порнороликов ). Дальше, понадобилось однажды заменить юзер агент и ось( что бы не сверкать линуксовостью ). Хром агента меняет, а ось никак, в фоксе всё без проблем. Ещё подметил такую фигню что noscript работает лучше по блокировке js чем стандартные хромовые. Последнее что удерживало на хроме - mhtml. Но и здесь нашелся адон который сохраняет страницу целиком. А окончательно меня убедил CacheViewer. Стал я думать, раз такая гибкость, надо юзать лисицу. Я выбрал firefox 38.8 ESR по двум причинам: 1) Она умет работать со старыми адонами. 2) Менее привередлива к ресурсам. Заметил что старый noscript не поддерживается в 45, а новый в торе работает не так как раньше( нахер такое новьё ). Мощь старых возможностей просто поражает. Граблю я планирую запускать на VDS c 512RAM поэтому пункт 2 важен. Запускал так. ( Как установить jpm https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm ) jpm run Если так запускать, то в терминале видно console.log() и ошибки. Первое что понадобится это кнопка запуска. Code: //index.js var { Hotkey } = require( "sdk/hotkeys" ) ,notifications = require( "sdk/notifications" ) ,старт = Hotkey ( { combo : "accel-shift-1", onPress : function( ) { notifications.notify( { title : "ГРАБЛЯ", text : "Стартанула!" } ); } } ) ; Ещё понадобится обмен данными с локальным сервером.( Глядеть в терминал ) Code: //index.js var урл = "[URL]http://localhost/index.php[/URL]" ,Request = require( "sdk/request" ).Request ; function дай( урл ) { if( typeof( урл ) == 'string' ) { var запрос = Request ({ url : урл ,overrideMimeType: "text/plain; charset=utf-8" ,onComplete : function( response ) { console.log( response.text ); } }); запрос.get(); return( true ); } return( false ); } дай( урл ); function прими( урл, данные ) { if( typeof( урл ) == 'string' && typeof( данные ) == 'string' ) { var заброс = Request ({ url : урл ,content : данные ,contentType : "text/plain" }); заброс.post(); return( true ); } return( false ); } прими( урл, "????????" ); Code: //index.php <?php if( isset( $_SERVER[ 'REQUEST_METHOD' ] ) ) { if( $_SERVER[ 'REQUEST_METHOD' ] == 'GET' ) { echo( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); exit( 0 ); } if( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' ) { $fd = fopen( "php://input", "r" ); $данные = ""; while( !feof( $fd ) ) { $данные .= fread( $fd, 0x10000 ); } file_put_contents( "../data.txt", $данные, FILE_APPEND ); exit( 0 ); } } Ещё нужно уметь запустить скрипт внутри страницы и получить от неё данные. Code: //index.js var урл = '[URL]http://localhost/index.php[/URL]' ,tabs = require( "sdk/tabs" ) ,tab = undefined ; tab = tabs.activeTab; tab.url = урл; tab.on( 'ready', function( tab ) { var скрипт = { contentScriptFile : 'content.js' } ,worker = undefined ; worker = tab.attach( скрипт ); worker.port.on( 'наружу', function( сообщение ) { console.log( сообщение ); } ); }); Code: //data/content.js alert("Грабля внутри."); self.port.emit( 'наружу', 'Сработало!' ); Code: <!doctype html> <!-- index.php --> <html> <head> <meta http-equiv="Content Type" content="text/html; charset=utf-8" /> <title>ТЕСТЕР</title> </head> <body> <h1>ТЕСТОВАЯ СТРАНИЦА!</h1> </body> </html> Теперь надо выдернуть с гугловой страницы информацию. Code: //index.js var tabs = require( "sdk/tabs" ) ,tab = undefined ; tab = tabs.activeTab; tab.on( 'ready', function( tab ) { var скрипт = { contentScriptFile : 'content.js' } ; tab.attach( скрипт ); }); Code: //data/content.js var урл = '' ,урлы = [] ,след = '' ,текст = '' ,cites = [] ,a = undefined ,l = 0 ,i = 0 ,re = /^$/ ,ret = null ; урл = document.documentURI; re = /^(https\:\/\/www\.google\.[a-z]+)\/search\?.+$/; ret = re.exec( урл ); if( ret != null ) { текст += "урл: " + урл + "\n"; cites = document.getElementsByTagName( 'cite' ); l = cites.length; for( i = 0; i < l; i++ ) { if( typeof( cites[ i ].className ) == 'string' && cites[ i ].className == '_Rm' ) { урлы.push( cites[ i ].textContent ); текст += i.toString() + ") " + cites[ i ].textContent + "\n"; } } a = document.getElementById( 'pnnext' ); след = ret[ 1 ] + a.getAttributeNode( 'href' ).value; текст += "следующая: " + след; alert( текст ); } Это не вся грабля, а её лучшая половина.( Всей грабли ещё нет ) Центральные узлы созданы, осталась переферия.