【问题标题】:Clicking a link does not refresh the content单击链接不会刷新内容
【发布时间】:2014-11-21 09:30:43
【问题描述】:

我一直在研究如何使用 PhantomJS 在网页上自动执行操作,但是在操作页面以执行我想要的操作时遇到问题。

我正在使用this as test site。我已经设法让 Phantom 打开网页并从#result 跨度中抓取随机句子。但现在我想做的是在不重新启动脚本的情况下再获得一句话。我不想关闭并重新打开页面,因为 Phantom 需要很长时间才能启动 webkit 并加载页面。所以我想我可以通过让 Phantom 点击句子框下方的“刷新”按钮来获得另一个句子。这是我目前拥有的:

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

console.log("connecting...");   

page.open("http://watchout4snakes.com/wo4snakes/Random/RandomSentence", function(){    
    console.log('connected');
    var content = page.content;
    var phrase = page.evaluate(function() {
        return document.getElementById("result").innerHTML;
    });

    console.log(phrase);
    page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
        page.evaluate(function() {
            $("frmSentence").click();
        });
    });

    var content = page.content;
    var phrase = page.evaluate(function() {
        return document.getElementById("result").innerHTML;
    });

    console.log(phrase);
    phantom.exit();
});

如您所见,我正在尝试使用 .click() 函数单击刷新按钮,但这对我不起作用,因为我仍然得到与之前相同的句子。给定按钮的 HTML:

<form action="/wo4snakes/Random/NewRandomSentence" id="frmSentence" method="post" novalidate="novalidate">        
    <p><input type="submit" value="Refresh"></p>
</form>

我不确定我应该在要点击的脚本中引用什么?我正在尝试表单 ID 'frmSentence',但这不起作用。我想知道.click() 是否是解决此问题的正确方法,Phantom 是否有某种方法可以提交按钮链接到的表单?或者也许我可以在获取句子的页面上运行相关脚本?我对这个有点迷茫所以我真的不知道我应该采用哪种方法?

【问题讨论】:

    标签: javascript html automation phantomjs bots


    【解决方案1】:

    您的控制流有问题。 page.includeJs 是一个异步函数。如果您还有其他一些语句page.includeJs,它们很可能在脚本加载和回调执行之前执行。这意味着在您的情况下,您甚至在触发点击之前已经阅读了 2 次句子。

    如果你想多次这样做,我建议使用递归,因为你不能同步写。此外,由于您希望它更快,因此您不能使用超时为 1 秒的静态 setTimeout,因为有时请求可能会更快(您会浪费时间),有时会更慢(您的脚本会中断)。你应该使用waitFor from the examples

    您可以将page.includeJs 向上移动并将其他所有内容都包含在其回调中,而不是每次都加载jQuery。如果您只需要单击一个元素或者如果 jQuery click 不起作用(是的,有时会发生这种情况),您应该使用PhantomJS; click an element

    【讨论】:

      【解决方案2】:

      网络抓取是将需求信息发送到网络服务器并获取结果。这与用户单击按钮或输入搜索条件的行为无关。 在此示例中,您需要做的就是向http://watchout4snakes.com/wo4snakes/Random/NewRandomSentence 发送一个 POST 请求。结果只是page.content 中的文本,甚至不需要评估。所以要得到不止一个句子,你只需要循环page.open

      【讨论】:

      • 感谢您的回答。我对page.open 的最初问题是连接和获取数据需要很长时间,我希望能够相对无缝地获取一个新句子。如果只是将 POST 发送到给定地址,那么有没有办法在页面仍然打开时使用 Phantom 自动执行此操作?还是发送page.open 命令的POST 部分?
      • 如果你打开NewRandomSentence,你可以试试page.reload()。但是您可能需要测试可靠性。我每次用 3 个小步骤(搜索、进入详细信息页面、下载报告)抓取 100K+ 数据,并且 PhantomJS 崩溃的频率高达 5 个请求。在更改为对每个请求执行 page.open 之后,它的可靠性稍高,每次崩溃100 个左右的请求。也许它只适用于 https 而不是 http 我不确定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多