PhantomJS发送的HTTP请求?

3
在我的phantomJS脚本中,我想在使用它来爬取HTML内容之前进行一些HTTP请求以设置一些变量。
正确的方法是从PhantomJS中发出HTTP请求吗? 我应该使用PageObject并将其处理为网页吗? 或者我可以使用某些XHR功能来实现这个? 我想先获取一些Json数据。

你也可以考虑将参数作为命令行参数传递到Phantom脚本中。 - Joe
1个回答

3

您有几个不同的选择。最简单的方法是使用WebPage模块,打开包含所需数据的页面的URL,然后使用其他WebPage对象进行抓取。

var webpage = require('webpage');
var page = webpage.create()
page.open('<some url>', function(status) {
  var option1 = page.evaluate(function() { ... });
  var option2 = page.evaluate(function() { ... });

  another = webpage.create();
  another.open('<another url>', function(status) {
    another.evaluate(function(opt1, opt2) {

      // you have access to opt1 and opt2 here

    }, option1, option2);
  });
  page.close();
});

然后你可以在“another”页面中访问option1和option2变量。
另一个选项是使用命令行参数,就像Joe上面提到的那样。你甚至可以编写接受变量作为命令行参数的PhantomJS代码,编写一个Node.js/Python/Ruby脚本来进行网页请求、解析和生成具有适当命令行参数的PhantomJS进程。
这两种方法都可行,但如果你想将代码保留在一个文件中,我会选择第一条路线。

1
我正在从Web服务器生成我的脚本,并通过命令行传递参数,但是在我的脚本运行时,我需要向控制服务器发送频繁的更新。使用WebPage对象非常重量级,尤其是因为我使用的是Slimer而不是Phantom(这是此任务的要求)。由于我无法使用节点http模块,也许有一个独立的http模块可以使用。或者使用curl? - emkman
我在SlimerJS文档中没有看到任何可以用来生成命令和缓冲输出的内容(这是运行类似curl的Linux命令所需的)。我认为在这里使用网页对象来完成这个任务可能是你唯一的选择。 - Josh Gummersall
我也没找到任何东西,所以我使用了一个网页对象。这很奇怪,因为在 Phantom 文档中甚至有一节叫做进程间通信,建议使用向外部服务器的 http 请求:http://phantomjs.org/inter-process-communication.html。但遗憾的是,他们没有提供具体的示例。谢谢你的帮忙查看。也许我会提出一个功能请求。 - emkman
通过查看他们的示例,似乎唯一发送http请求的方法是使用page.open - 这是一个POST请求的示例:https://github.com/ariya/phantomjs/blob/master/examples/post.js - 您可以将请求类型作为第二个参数传递。 - danecando
这是我找到的最简单的方法。我也尝试在页面内使用XMLHttpRequest,但那变得非常棘手。谢谢! - chetbox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接