Ответ 1
{ parameters: { 'proxy': 'socks://98.239.198.83:21320' } }
Они не обновили свои документы.
На этой странице https://www.npmjs.com/package/phantom#functionality-details говорится:
Вы также можете передать ключи командной строки в процесс phantomjs, указав дополнительные аргументы для phantom.create(), например:
phantom.create '--load-images=no', '--local-to-remote-url-access=yes', (page) ->
или указав их в объекте options *:
phantom.create {parameters: {'load-images': 'no', 'local-to-remote-url-access': 'yes'}}, (page) ->
Эти примеры приведены только в кофе script, а также они намекают, что функция create может принимать
create('string',function)
или
create([object object],function)
но на самом деле первым ожидаемым параметром является функция!
Мне очень хотелось попробовать http://phantomjs.org/api/command-line.html У меня может быть неправильная идея, но для меня это похоже, что они могут использоваться в функции create (прямо перед вами createPage), я не прав?
Я пробовал несколько вещей, самый логичный из них:
var phantom = require('phantom');
phantom.create(function(browser){
browser.createPage(function(page){
page.open('http://example.com/req.php', function() {
});},{parameters:{'proxy':'98.239.198.83:21320'}});});
Итак, страница открывается. Я знаю это, потому что я делаю req.php, сохраняя объект $_SERVER на txt-пэде, но заголовки REMOTE_ADDR и REMOTE_PORT не являются теми, которые я установил в прокси-сервере. Они не действуют. Я также пробовал:
{options:{'proxy':'98.239.198.83:21320'}}
Поскольку документы вызывают этот объект, объект options * * см. выше ^
и
'--proxy=98.239.198.83:21320'
Я также проверил модуль phantom, чтобы найти функцию create. Это не написано в js. Я не вижу его, по крайней мере. Он должен быть в С++. Похоже, что этот модуль обновлен, но примеры, находящиеся внутри модуля, похожи на старый код.
Как это сделать?
EDIT:
var phantom = require('phantom');
phantom.create(function(browser){
browser.createPage(function(page){
browser.setProxy('98.239.198.83','21320','http', null, null, function(){
page.open(
'http://example.com/req.php', function() {
});});});});
Это не вызывает ошибок, и страница очищается, но прокси игнорируется.
{ parameters: { 'proxy': 'socks://98.239.198.83:21320' } }
Они не обновили свои документы.
Как для версии phantom 2.0.10, следующий код работает очень хорошо в моей машине Windows
phantom.create(["--proxy=201.172.242.184:15124", "--proxy-type=socks5"])
.then((instance) => {
phInstance = instance;
return instance.createPage();
})
.then((page) => {
sitepage = page;
return page.open('http://newsdaily.online');
})
.then((status) => {
console.log(status);
return sitepage.property('title');
})
.then((content) => {
console.log(content);
sitepage.close();
phInstance.exit();
})
.catch((error) => {
console.log(error);
phInstance.exit();
});
В качестве побочного эффекта при попытке выяснить проблему на Github для phantomjs-nodejs я смог установить прокси следующим образом:
phantom = require 'phantom'
parameters = {
loadimages: '--load-images=no',
websecurity: '--web-security=no',
ignoresslerrors: '--ignore-ssl-errors=yes',
proxy: '--proxy=10.0.1.235:8118',
}
urls = {
checktor: "https://check.torproject.org/",
google: "https://google.com",
}
phantom.create parameters.websecurity, parameters.proxy, (ph) ->
ph.createPage (page) ->
page.open urls.checktor, (status) ->
console.log "page opened? ", status
page.evaluate (-> document.title), (result) ->
console.log 'Page title is ' + result
ph.exit()
Результат, когда прокси использует Tor, был:
открыта страница? Успех
Название страницы - Поздравляю. Этот браузер настроен на использование Tor.
Время продолжается, поэтому PhantomJS теперь может устанавливать прокси "на лету" (даже на основе каждой страницы): см. эту фиксацию: https://github.com/ariya/phantomjs/commit/efd8dedfb574c15ddaac26ae72690fc2031e6749
Вот пример использования новой функции setProxy (я не нашел использование параметров веб-страницы, это общее использование прокси-сервера, например, phantom):
https://github.com/ariya/phantomjs/blob/master/examples/openurlwithproxy.js
Если вам нужен прокси-сервер на странице, используйте полный URL-адрес прокси (схема, имя пользователя, пароль, хост, порт - все это URL-адрес)
используйте пакет phantom npm и пакет co npm.
co(function*() {
const phantomInstance = yield phantom.create(["--proxy=171.13.36.64:808"]);
crawScheduler.start(phantomInstance);
});
Пример CoffeeScript немного странный, потому что это browser
, который передается в обратный вызов phantom.create
, а не page
, но в противном случае он должен быть совместимым, судя по code.
var phantom = require('phantom');
phantom.create({
parameters: {
proxy: '98.239.198.83:21320'
}
}, function(browser){
browser.createPage(function(page){
page.open('http://example.com/req.php', function() {
...
});
});
});
Настройки прокси устанавливаются во время создания процесса, а не во время открытия страницы. Хотя PhantomJS содержит недокументированную функцию phantom.setProxy()
, которая позволяет вам изменять настройки прокси-сервера в середине script. Модуль phantom также выглядит поддерживает его.
Я запускаю PhantomJS из Windows cmd и синтаксис, который он использует, выглядит немного иначе, чем я заметил, если вы не указали http://
PJ не распознает значение, это полный пример
var page = require('webpage').create();
page.settings.loadImages = false; //
page.settings.proxy = 'http://192.168.1.5:8080' ;
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';
page.open('http://some.com/page', function() {
page.render('some.png');
phantom.exit();
});
Еще одно решение для nodejs:
const phantomInstance = await require('phantom').create();
const page = await phantomInstance.createPage();
// get current settings:
var pageSettings = await page.property('settings');
/*
{
XSSAuditingEnabled: false,
javascriptCanCloseWindows: true,
javascriptCanOpenWindows: true,
javascriptEnabled: true,
loadImages: true,
localToRemoteUrlAccessEnabled: false,
userAgent: 'Mozilla/5.0 (Unknown; Linux x86_64) ... PhantomJS/2.1.1 Safari/538.1',
webSecurityEnabled: true
}
*/
pageSettings.proxy = 'https://78.40.87.18:808';
// update settings (return value is undefined):
await page.property('settings', pageSettings);
const status = await page.open('https://2ip.ru/');
// show IP:
var ip = await page.evaluate(function () {
var el = document.getElementById('d_clip_button');
return !el ? '?' : el.textContent;
});
console.log('IP:', ip);
Это возможность установить прокси на определенной странице.
var phantom = require('phantom');
phantom.create(function (browser) {
browser.setProxy(proxyIP, proxyPort);
page.open(url, function (status) {
console.log(status);
});
},{dnodeOpts:{weak: false}});
он отлично работает на моих окнах.