如何在phantomjs中设置代理

时间:2015-02-17 21:40:25

标签: node.js proxy phantomjs

https://www.npmjs.com/package/phantom#functionality-details页面显示:

您还可以通过为phantom.create()指定其他参数来将命令行开关传递给phantomjs进程,例如:

phantom.create '--load-images=no', '--local-to-remote-url-access=yes', (page) ->

或在选项* 对象中指定它们:

phantom.create {parameters: {'load-images': 'no', 'local-to-remote-url-access': 'yes'}}, (page) ->

这些示例仅在咖啡脚本中,并且暗示创建函数可以采用

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对象保存到txt pad但是,REMOTE_ADDR和REMOTE_PORT标头不是我设置的代理中的标头。它们没有效果。我也尝试过:

{options:{'proxy':'98.239.198.83:21320'}}

当文档将该对象称为选项* 对象*时,请参阅上面的^

'--proxy=98.239.198.83:21320'

我还通过幻像模块挖掘了一下创建函数。它不是用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() {

         });});});});

这不会产生错误,页面会被删除,但会忽略代理。

9 个答案:

答案 0 :(得分:4)

{ parameters: { 'proxy': 'socks://98.239.198.83:21320' } }

他们没有更新他们的文档。

答案 1 :(得分:4)

至于幻影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();
      });

答案 2 :(得分:2)

作为试图找出issue on Github for phantomjs-nodejs的副作用,我可以按如下方式设置代理:

hostname

代理使用Tor的结果是:

  

页面打开了吗?成功

     

页面标题是祝贺。此浏览器配置为使用Tor。

答案 3 :(得分:2)

时间正在进行,因此PhantomJS现在能够“动态”设置代理(即使是基于每页):请参阅此提交:https://github.com/ariya/phantomjs/commit/efd8dedfb574c15ddaac26ae72690fc2031e6749

以下是新setProxy函数的示例用法(我没有找到网页设置用法,这是幻像实例上代理的一般用法):

https://github.com/ariya/phantomjs/blob/master/examples/openurlwithproxy.js

如果您需要每页代理,请使用代理的完整URL(架构,用户名,密码,主机,端口 - 所有URL)

答案 4 :(得分:2)

使用幻影npm包和co npm包。

co(function*() {
  const phantomInstance = yield phantom.create(["--proxy=171.13.36.64:808"]);
  crawScheduler.start(phantomInstance);
});

答案 5 :(得分:1)

还有另一个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);

这是在特定页面内设置代理的选项。

答案 6 :(得分:0)

CoffeeScript示例有点奇怪,因为browser传递给phantom.create而不是page的回调,但是否则它必须兼容{ {3}}

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()函数,它允许您在脚本中间更改代理设置。幻影模块似乎也code

答案 7 :(得分:0)

我正在从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();
});

答案 8 :(得分:-1)

var phantom = require('phantom');
phantom.create(function (browser) {
    browser.setProxy(proxyIP, proxyPort);
    page.open(url, function (status) {
        console.log(status);
    });
},{dnodeOpts:{weak: false}});

它在我的窗户上工作正常。