Поиск по блогу

суббота, 16 мая 2015 г.

Ссылки и фрагманты кода ...при чтении статей и документации к Phantomjs, Slimerjs, Casperjs

Решил, что пришла пора прочитать документацию к Phantomjs, Slimerjs, Casperjs. Читать надо было именно в этой последовательности. За этим занятием провел день. Предыдущий мой наскок на Slimerjs был в январе. Я тогда даже установил его..., но плохо помнил об этом. Потому сегодня решил разобраться, как это работает и с чего начинать.
Предварительные выводы: в Phantomjs есть REPL и множество примеров, а в документации Slimerjs есть описание классов. Первый на Webkit, второй на Geko. Без них никуда. А вот на "синатксический подсластитель" Casperjs время тратить не хочется.
Мне пока проще фантомом вырезать в файл один блок (div) с вебстраницы, а потом рапарсить его в (более мощном) Scrapy. Так что Casperjs пока будет стоять в очереди за Nodejs... Здесь еще фргменты кода из статей и видео.

Installation
Как захватить мир, или javascript next уже сейчас (часть первая)
Простой парсинг сайтов с помощью SlimerJS
Еще два видео этого автора
Quick Start phantomjs.org
Quick Start
Решение главных проблем CAPTCHA
mitmproxy An interactive console program that allows traffic flows to be intercepted, inspected, modified and replayed.
HAR Viewer (HTTP Archive Viewer) is an online tool visualizing HTTP Archive (HAR) files produced by HTTP tracking tools.
Phantom django video
Пишем парсер сайтов с использованием PhantomJS
Делаем правильный граббинг\парсинг при помощи JavaScript 2
Grabbing HTML source code with PhantomJS or CasperJS

Phantomjs REPL: Read-Eval-Print Loop
Phantomjs Command Line Interface
Configuration Slimer](http://docs.slimerjs.org/current/configuration.html)
CasperJS
is a navigation scripting & testing utility for PhantomJS and SlimerJS written in Javascript ... It eases the process of defining a full navigation scenario and provides useful high-level functions, methods

In [ ]:
####Из руководства по установке [Installation](http://docs.slimerjs.org/current/installation.html) 

Нужно только распаковать архив и прописать пути в переменных окружения... На машинах с LInux надо проверить наличие библиотек

In [ ]:
 

Первым делом мы скачиваем slimerjs, распаковываем в папку, и прописываем системные переменные. В моем случае это была папка C:/Tools/slimerjs, добавляем это в переменную path. Также нам нужно установить переменную для Firefox, так как slimerjs требует Firefox, для запуска. Переменную SLIMERJSLAUNCHER в моем случае я установил так: C:\Program Files (x86)\Mozilla Firefox\firefox.exe. Что же, на этом наши магические манипуляции заканчиваются. Приступим к написанию кода, для проверки фич ecma 6.

...хотелось бы узнать, делали ли вы связку с CasperJS?

In [ ]:
#    Установил casperjs по инструкции без phantomjs.
#    В папке bin переименовал файл «casperjs.exe» в «casperjs_exe.exe».
#    Создал файл casperjs.bat с содержимым:

    @echo off
    casperjs_exe --engine=slimerjs %*


#    Затем добавил slimerjs в PATH.
#    Отредактировал slimerjs.bat, шестую строку:

    SET SLIMERDIR=%~dp0


#    заменил на:

    if not exist (%SLIMERDIR%) (
        SET SLIMERDIR=%~dp0
    )


#    Запустил пример CasperJS:

    var casper = require('casper').create();

    casper.start('http://casperjs.org/', function() {
        this.echo(this.getTitle());
    });

    casper.thenOpen('http://phantomjs.org', function() {
        this.echo(this.getTitle());
    });

    casper.run();


#    PROFIT! — Всё заработало на Standalone Edition и Lightweight Edition.

Паузы, события заполнения поля и нажатия клавиши, фотграфирование и отправка капчи...

In [ ]:
var webpage = require('webpage').create();
webpage
  .open('http://example.com') 
  .then(function(){ 
    slimer.wait(3000); //# пауза, длительность в миллисекундах
    var someContent = webpage.evaluate(function () { // # после того как динамический контент подгружен, можно его спарсить
        return document.querySelector("#aDiv").textContent;
    });
  });
In [ ]:
var webpage = require('webpage').create();
webpage
  .open('http://example.com') 
  .then(function(){ 
    webpage.evaluate(function () { 
        document.getElementById("input").focus();
    });
    webpage.sendEvent('keypress', "hello World"); 
  });
In [ ]:
var webpage = require('webpage').create();
webpage
  .open('http://example.com') 
  .then(function(){ 
    webpage.clipRect = { top: 14, left: 3, width: 400, height: 300 }; // #для использования этой функции нам должны быть известно позиционирование каптчи
    var screen = webpage.renderBase64('png'); // # обычно я кодирую изображение в base64, так его проще передать сторонему сервису
    var webpage2 = require('webpage').create(); // # создаем второе соединени
    webpage2
      .open('http://example2.com') 
      .then(function(){  // #...далее думаю уже должно быть понятно
  });
In [ ]:
phantomjs [options] somescript.js [arg1 [arg2 [...]]]

Supported command-line options are:

In [ ]:
    --help or -h lists all possible command-line options. Halts immediately, will not run a script passed as argument.
    --version or -v prints out the version of PhantomJS. Halts immediately, will not run a script passed as argument.
    --cookies-file=/path/to/cookies.txt specifies the file name to store the persistent Cookies.
    --disk-cache=[true|false] enables disk cache (at desktop services cache storage location, default is false). Also accepted: [yes|no].
    --ignore-ssl-errors=[true|false] ignores SSL errors, such as expired or self-signed certificate errors (default is false). Also accepted: [yes|no].
    --load-images=[true|false] load all inlined images (default is true). Also accepted: [yes|no].
    --local-storage-path=/some/path path to save LocalStorage content and WebSQL content.
    --local-storage-quota=number maximum size to allow for data.
    --local-to-remote-url-access=[true|false] allows local content to access remote URL (default is false). Also accepted: [yes|no].
    --max-disk-cache-size=size limits the size of disk cache (in KB).
    --output-encoding=encoding sets the encoding used for terminal output (default is utf8).
    --remote-debugger-port starts the script in a debug harness and listens on the specified port
    --remote-debugger-autorun runs the script in the debugger immediately: 'yes' or 'no' (default)
    --proxy=address:port specifies the proxy server to use (e.g. --proxy=192.168.1.42:8080).
    --proxy-type=[http|socks5|none] specifies the type of the proxy server (default is http).
    --proxy-auth specifies the authentication information for the proxy, e.g. --proxy-auth=username:password).
    --script-encoding=encoding sets the encoding used for the starting script (default is utf8).
    --ssl-protocol=[sslv3|sslv2|tlsv1|any'] sets the SSL protocol for secure connections (default is SSLv3).
    --ssl-certificates-path=<val> Sets the location for custom CA certificates (if none set, uses system default).
    --web-security=[true|false] enables web security and forbids cross-domain XHR (default is true). Also accepted: [yes|no].
    --webdriver starts in 'Remote WebDriver mode' (embedded GhostDriver): '[[:]]' (default '127.0.0.1:8910')
    --webdriver-selenium-grid-hub URL to the Selenium Grid HUB: 'URLTOHUB' (default 'none') (NOTE: works only together with '--webdriver')

Alternatively, since PhantomJS 1.3, you can also utilize a JavaScript Object Notation (JSON) configuration file instead of passing in multiple command-line options:

In [ ]:
--config=/path/to/config.json

The contents of config.json should be a standalone JavaScript object. Keys are de-dashed, camel-cased equivalents of the other supported command-line options (excluding --version/-v and --help/-h).
Values are their JavaScript equivalents: 'true'/'false' (or 'yes'/'no') values translate into true/false Boolean values, numbers remain numbers, strings remain strings. For example:

In [ ]:
{
  /* Same as: --ignore-ssl-errors=true */
  "ignoreSslErrors": true,

  /* Same as: --max-disk-cache-size=1000 */
  "maxDiskCacheSize": 1000,

  /* Same as: --output-encoding=utf8 */
  "outputEncoding": "utf8"

  /* etc. */
}

There are some keys that do not translate directly:

In [ ]:
 * --disk-cache => diskCacheEnabled
 * --load-images => autoLoadImages
 * --local-storage-path => offlineStoragePath
 * --local-storage-quota => offlineStorageDefaultQuota
 * --local-to-remote-url-access => localToRemoteUrlAccessEnabled
 * --web-security => webSecurityEnabled
In [ ]:
//phantomjs
var page = require('webpage').create();
var url = 'http://instagram.com/';
 
page.open(url, function (status) {
var js = page.evaluate(function () {
return document;
});
console.log(JSON.stringify(js));
phantom.exit();
});
 
 
 
 
//casperjs
var casper = require('casper').create();
var url = 'http://instagram.com/';
 
casper.start(url, function() {
var js = this.evaluate(function() {
return document;
});
this.echo(JSON.stringify(js));
});
casper.run(); 
In [ ]:
//phantomjs
var page = require('webpage').create();
var url = 'http://instagram.com/';
 
page.open(url, function (status) {
var js = page.evaluate(function () {
return document;
});
console.log(js.all[0].outerHTML);
phantom.exit();
});
 
 
 
 
//casperjs
var casper = require('casper').create();
var url = 'http://instagram.com/';
 
casper.start(url, function() {
var js = this.evaluate(function() {
return document;
});
this.echo(js.all[0].outerHTML);
});
casper.run(); 
In [ ]:
// argument results
var a1, a2, a3, a4;
 
function optionParser() {  
    var opt = 0;
    while((opt < phantom.args.length) && (phantom.args[opt][0]=='-')) {
        var sw = phantom.args[opt];
        switch(sw) {
            case '-a1':
                opt++;
                a1 = phantom.args[opt];
                break;
            case '-a2':
                opt++;
                a2 = phantom.args[opt];
                break;
            case '-a3':
                opt++;
                a3 = phantom.args[opt];
                break;
            case '-a4':
                opt++;
                a4 = phantom.args[opt];
                break;
            default:
                console.log('Unknown switch: ' + phantom.args[opt]);
                phantom.exit();
                break;
        }
        opt++;
    }
}
In [ ]:
var page = require('webpage').create(),
     fs = require('fs'),
     data = "var dataObject = { item: 'value' };",
     fullpath;
 
fullpath = fs.workingDirectory + fs.separator + 'data.js';
// open file for writing
var dataFile = fs.open(fullpath, 'w');
dataFile.write(data);
dataFile.close();
 
// check that the file was successfully written
if(fs.size(fullpath) > 0) {
    console.log('File wrote successfully!');
    page.open('http://somesite.org/page.html');
    // put page data in a local variable
    var output = page.evaluate(function () {
        // print the output of the data object
        console.log(dataObject.item);
        return dataObject.item;
    });
    // output should be the same value as the page's dataObject.item
    console.log(output);
}
else {
    console.log('Error in writing the file!');
    phantom.exit();
}
 
page.onLoadFinished = function() {
    // inject the javascript data that we created earlier
    page.injectJS(fullpath);
}


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий