javascript - phantomjs - 页面加载后执行 Javascript 函数,然后输出新的更改

标签 javascript php web-scraping phantomjs casperjs

我使用 phantomjs 2.1.1,有些事情困扰着我。 这是我用来抓取 url 的代码,并将网站的 html 写入到 output.html 文件中

page = require('webpage').create();
    page.open(url, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
            phantom.exit();
        } else {
            window.setTimeout(function () {
                var content = page.content;
                fs.write("output.html", content, 'w');
            }, 40000); //40 seconds timeout
        }
    });

现在,我还需要抓取它的分页。接下来的页面由 javascript 函数 page(2) 加载;或第(3)页;我尝试使用

来完成它
 var pageinationOutput = page.evaluate(function (s) {
    page(2);
 });
 console.log(pageinationOutput); // I need the output made by the  `page(2);` call.

        page = require('webpage').create();
            page.open(url, function (status) {
                if (status !== 'success') {
                    console.log('Unable to load the address!');
                    phantom.exit();
                } else {
                    window.setTimeout(function () {
                        var content = page.content;
                        fs.write("output.html", content, 'w');
                    }, 40000); //40 seconds timeout
                }
            });

但是我没有得到任何输出。 如何在页面加载完成后执行 JavaScript 函数并获取 javascript 执行后网站内容发生的新更改,在这种情况下网站将调用下一个页面(使用 ajax)第(2)页之后;方法调用。

提前致谢!

最佳答案

我自己找到了解决方案,但我不确定这是否是完美的方法。

代码:

page.open(url, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit();
    } else {
        window.setTimeout(function () {
            var content = page.content;
            fs.write("output.html", content, 'w');
            page.evaluate(function (cb) {
                window.page(2);
            });
            var waiter = window.setInterval(function () {
                var nextPageContent = page.evaluate(function (cb) {
                    return document.documentElement.outerHTML;
                });
                if (nextPageContent !== false) {
                    window.clearInterval(waiter);
                    fs.write("output-2.html", content, 'w');
                }
            }, 40000);//40 seconds timeout  

        }, 40000);//40 seconds timeout  
    }
});

关于javascript - phantomjs - 页面加载后执行 Javascript 函数,然后输出新的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35472991/

相关文章:

excel - 使用 selenium 将文件下载到特定目录

javascript - if 条件不会停止启用

php - 如何处理抽象类 PDO 中的错误

csv - 如何在scrapy中提取文本以及超链接文本?

python - Scrapy 产生深度为 2 的请求

javascript - 我如何知道用户或单个 IP 地址在我网站的页面上花费了多长时间?

php - 频繁轮询会使服务器重载吗?如果是这样,实现实时更新的最佳方式是什么?

javascript - 在 qml 黑莓中将日期时间转换为毫秒时出错

javascript - backbone.js 0.9.2 将具有重复 id 的模型添加到集合中

php - symfony 3 的缓存失效是如何工作的?