如何在 phantomjs 中设置代理
How do I set proxy in phantomjs
这个 https://www.npmjs.com/package/phantom#functionality-details 页面说:
您还可以通过向 phantom.create() 指定额外的参数,将命令行开关传递给 phantomjs 进程,例如:
phantom.create '--load-images=no', '--local-to-remote-url-access=yes', (page) ->
或通过在 选项中指定它们* object:
phantom.create {parameters: {'load-images': 'no', 'local-to-remote-url-access': 'yes'}}, (page) ->
这些示例仅在 coffee 脚本中,它们还暗示创建函数可以采用
create('string',function)
或
create([object object],function)
但真正期望的第一个参数是函数!
我真的很想尝试 http://phantomjs.org/api/command-line.html 我可能有错误的想法,但对我来说,它们似乎可以在创建函数中使用(就在您执行 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 object 保存到 txt pad 但是, REMOTE_ADDR 和 REMOTE_PORT headers 不是我设置的代理。它们没有效果。我也试过:
{options:{'proxy':'98.239.198.83:21320'}}
正如文档所说 object 选项* object *见上文^
和
'--proxy=98.239.198.83:21320'
我还深入研究了 phantom 模块以找到创建函数。它不是用js写的我至少看不到它。它必须在 C++ 中。看起来这个模块已经更新了,但是模块内部的示例看起来像旧代码。
我该怎么做?
编辑:
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() {
});});});});
这不会产生任何错误,页面会被抓取但代理会被忽略。
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()
函数,它使您能够在脚本中间更改代理设置。 phantom模块好像也support it.
{ parameters: { 'proxy': 'socks://98.239.198.83:21320' } }
他们没有更新文档。
var phantom = require('phantom');
phantom.create(function (browser) {
browser.setProxy(proxyIP, proxyPort);
page.open(url, function (status) {
console.log(status);
});
},{dnodeOpts:{weak: false}});
它在我的 windows 上运行良好。
作为尝试找出 issue on Github for 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 的结果是:
page opened? success
Page title is Congratulations. This browser is configured to use Tor.
至于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();
});
时间还在继续,所以 PhantomJS 现在可以设置代理 "on the fly"(甚至在每页的基础上):请参阅此提交: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);
});
我是 运行 来自 windows cmd 的 PhantomJS,它使用的语法看起来与我注意到的有点不同,如果你没有输入 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);
在特定页面中设置代理的选项。
这个 https://www.npmjs.com/package/phantom#functionality-details 页面说:
您还可以通过向 phantom.create() 指定额外的参数,将命令行开关传递给 phantomjs 进程,例如:
phantom.create '--load-images=no', '--local-to-remote-url-access=yes', (page) ->
或通过在 选项中指定它们* object:
phantom.create {parameters: {'load-images': 'no', 'local-to-remote-url-access': 'yes'}}, (page) ->
这些示例仅在 coffee 脚本中,它们还暗示创建函数可以采用
create('string',function)
或
create([object object],function)
但真正期望的第一个参数是函数!
我真的很想尝试 http://phantomjs.org/api/command-line.html 我可能有错误的想法,但对我来说,它们似乎可以在创建函数中使用(就在您执行 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 object 保存到 txt pad 但是, REMOTE_ADDR 和 REMOTE_PORT headers 不是我设置的代理。它们没有效果。我也试过:
{options:{'proxy':'98.239.198.83:21320'}}
正如文档所说 object 选项* object *见上文^
和
'--proxy=98.239.198.83:21320'
我还深入研究了 phantom 模块以找到创建函数。它不是用js写的我至少看不到它。它必须在 C++ 中。看起来这个模块已经更新了,但是模块内部的示例看起来像旧代码。
我该怎么做?
编辑:
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() {
});});});});
这不会产生任何错误,页面会被抓取但代理会被忽略。
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()
函数,它使您能够在脚本中间更改代理设置。 phantom模块好像也support it.
{ parameters: { 'proxy': 'socks://98.239.198.83:21320' } }
他们没有更新文档。
var phantom = require('phantom');
phantom.create(function (browser) {
browser.setProxy(proxyIP, proxyPort);
page.open(url, function (status) {
console.log(status);
});
},{dnodeOpts:{weak: false}});
它在我的 windows 上运行良好。
作为尝试找出 issue on Github for 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 的结果是:
page opened? success
Page title is Congratulations. This browser is configured to use Tor.
至于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();
});
时间还在继续,所以 PhantomJS 现在可以设置代理 "on the fly"(甚至在每页的基础上):请参阅此提交: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);
});
我是 运行 来自 windows cmd 的 PhantomJS,它使用的语法看起来与我注意到的有点不同,如果你没有输入 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);
在特定页面中设置代理的选项。