LINUX.ORG.RU

Как пустить headless браузер через определенный сетевой интерфейс?

 , ,


0

1

Собственно надо парсить сложный сайт. Поэтому решил использовать headless браузер. Phantom.js. Собственно управлять всем этим надо из Node.js, поэтому тут еще и Casper.js + Spooky.js
Но парсить надо с разных сетевых интерфейсов (tunX - OpenVPN)
Когда был просто request, там был параметр localAddress, в котором прописывался ip адрес интерфейса и всё.
Но как заставить ходить не напрямую Phantom.js? Ну или Firefox через Slimer.js (Casper.js и его поддерживает)

Собственно вот пример с сайта. Работает. Но как тут указать сетевой интерфейс?

var Spooky = require('spooky');

var spooky = new Spooky({
        child: {
            transport: 'http'
        },
        casper: {
            logLevel: 'debug',
            verbose: true
        }
    }, function (err) {
        if (err) {
            e = new Error('Failed to initialize SpookyJS');
            e.details = err;
            throw e;
        }

        spooky.start(
            'http://en.wikipedia.org/wiki/Spooky_the_Tuff_Little_Ghost');
        spooky.then(function () {
            this.emit('hello', 'Hello, from ' + this.evaluate(function () {
                return document.title;
            }));
        });
        spooky.run();
    });

spooky.on('error', function (e, stack) {
    console.error(e);

    if (stack) {
        console.log(stack);
    }
});

/*
// Uncomment this block to see all of the things Casper has to say.
// There are a lot.
// He has opinions.
spooky.on('console', function (line) {
    console.log(line);
});
*/

spooky.on('hello', function (greeting) {
    console.log(greeting);
});

spooky.on('log', function (log) {
    if (log.space === 'remote') {
        console.log(log.message.replace(/ \- .*/, ''));
    }
});

★★★★★

Последнее исправление: Qwentor (всего исправлений: 2)

Я тебя прочитал, и у меня аж щетина на сантиметр отросла, и домашние ХБ штаны внатяг обтянули ляшки. И из сигаретного фильтра пар повалил.

А по сути: указывашь своему фантомжеэсу в качестве прокси определённый IP для надёжности(IP сайта-жертвы) и в route маршрут прописываешь, чтобы на пакеты, пущенные в этом направлении через нужный интерфейс шли.

Правда как это в макоси или бубунтовых гуях я тебе не подскажу.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

route - это жестко и насовсем(
мне в процессе парсинга разные запросы через разные интерфейсы пускать надо

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Через какой интерфейс пускать запрос — решает система. Если хочешь решать ты, то тебе нужно опуститься до сетевого уровня, и воткнуть соотв. код. Не думаю, что в js есть такое, разве что через какой-нибудь хитрый модуль.

А выше тебе правильно сказали — указывай прокси, скорее всего он поддерживается.

soomrack ★★★★
()

net namespace.

anonymous
()

Если сильно нужно я бы попробовал весь трафик от парсера завернуть на свой самописаный прокси, и уже с него выбирал интерфейс с которого слать запрос. Рулить выбором интерфейса можно с того-же JS скрипта через API

zaz ★★★★
()
Ответ на: комментарий от Qwentor

Мне не знакомы, но поидее там писать по времени меньше чем гуглить (можно хоть на питоне, хоть на перле, хоть на Node.js, хочть на C/C++, хоть на PHP)

zaz ★★★★
()

Мир сошел с ума, если для парсинга сайта используется такой зоопарк... что мешает рулить фантомом напрямую? Как ни крути, с фантомом общаться можно только через жоппу ибо он не умеет в mpc и даже uds.

По теме - вы там часом не hidemyass для парсинга пытаетесь использовать? ;) в свое время тоже помучались с этим, самым удобным вариантом оказался простой самописный прокси сервер на py gevent, который уже сам делает ротацию интерфейсов. Ну а в вашем случае на тойже ноде.

genryRar ★★
()

policy routing же. Делаешь таблицу с дефолтным маршрутом через впн, дальше

ip rule add from $tun_ip lookup $your_table
ip rule add to $tun_ip lookup $your_table

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

anonymous
()

заверни всю эту штуку в виртуалку или контейнер

wackobird
()
Ответ на: комментарий от Qwentor

типа через LD_PRELOAD можно делать bind() на заданный адрес.

в гугле «linux ld_preload bind» дает море вариантов.

vel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.