5

我是 phantomjs、Java 脚本和 WebScraping 的新手。我想做的是基本的 http 身份验证,然后访问另一个 URL 以获取一些信息。这是我到目前为止所拥有的。请告诉我我做错了什么。

var page = require('webpage').create();
var system = require('system');

page.onConsoleMessage = function(msg) {
   console.log(msg);
};

page.onAlert = function(msg) {
   console.log('alert!!>' + msg);
};

page.settings.userName = "foo";
page.settings.password = "bar";

page.open("http://localhost/login", function(status) {
    console.log(status);
    var retval = page.evaluate(function() {
       return "test";
    });
    console.log(retval);

    page.open("http://localhost/ticket/" + system.args[1], function(status) {
        if ( status === "success" ) {
            page.injectJs("jquery.min.js");
            var k = page.evaluate(function () {
                var a = $("div.description > h3 + p");

                if (a.length == 2) {
                    console.log(a.slice(-1).text())
                } 
                else {
                    console.log(a.slice(-2).text())
                }
            //return document.getElementById('addfiles');
            });

        }
    });
    phantom.exit();
});

我正在向该文件传递一个参数:附加到第二个 URL 的票号。

4

1 回答 1

8

为此,我强烈推荐CasperJS

CasperJS 是一个开源导航脚本和测试实用程序,用 Javascript 编写,基于 PhantomJS——可编写脚本的无头 WebKit 引擎。它简化了定义完整导航场景的过程,并为执行常见任务提供了有用的高级功能、方法和语法糖,例如:

  • 定义和订购浏览导航步骤
  • 填写和提交表格
  • 点击并关注链接
  • 捕获页面(或其一部分)的屏幕截图
  • 测试远程 DOM
  • 记录事件
  • 下载资源,包括二进制资源
  • 编写功能测试套件,将结果保存为 JUnit XML
  • 抓取网页内容

(来自 CasperJS 网站)

我最近花了一天时间尝试让 PhantomJS 自己来做一些事情,比如填写登录表单并导航到下一页。

CasperJS 也为表单构建了一个很好的 API 用途:

http://docs.casperjs.org/en/latest/modules/casper.html#fill

var casper = require('casper').create();

casper.start('http://some.tld/contact.form', function() {
    this.fill('form#contact-form', {
        'subject':    'I am watching you',
        'content':    'So be careful.',
        'civility':   'Mr',
        'name':       'Chuck Norris',
        'email':      'chuck@norris.com',
        'cc':         true,
        'attachment': '/Users/chuck/roundhousekick.doc'
    }, true);
});

casper.then(function() {
    this.evaluateOrDie(function() {
        return /message sent/.test(document.body.innerText);
    }, 'sending message failed');
});

casper.run(function() {
    this.echo('message sent').exit();
});
于 2013-02-07T17:24:10.367 回答