【问题标题】:node-phantom is not enabling javascript on web pagesnode-phantom 没有在网页上启用 javascript
【发布时间】:2013-12-18 15:43:50
【问题描述】:

我正在使用 node-phantom 将项目发布到网站上的购物车。问题是当我使用 page.open 导航到购物车页面时(在已经将商品添加到购物车之后),我收到一个 html 响应,说我需要在浏览器中启用 javascript 才能查看购物购物车页面。我检查了 settings.javascriptEnabled 设置,发现它设置为“true”。此时我一头雾水,为什么页面会认为phantomjs没有启用javascript?

这是我的代码:

var phantom = require('node-phantom');

phantom.create(function (err, ph) {
    ph.createPage(function (err, page) {

        page.get('settings', function(err, oldSettings) {
            console.log('\r\n oldSettings:  ' + JSON.stringify(oldSettings));

            page.open('http://www.somesite.com/shoppingcart/default.cfm', function (err, status) {
                page.injectJs(jqueryPath, function (err) {
                    setTimeout(function() {     
                        page.evaluate(function (injectedSku) {
                            var localErr;
                            var skuInCart;
                            var checkoutLnkMsg;
                            var pageHTML;

                            try {              
                                pageHTML = $("html").html();

                                // Get 'SKUs' input element.
                                skuInCart = $('input[name="SKUs"]').val();

                                if (injectedSku === skuInCart) {
                                    var checkoutLnk = $('#cartAction_bottom a[alt="Checkout"');  

                                    checkoutLnk.on("click", function() {
                                        checkoutLnkMsg = '"' + checkoutLnk.href + '" link has been clicked';
                                    });

                                    checkoutLnk.click();            
                                } else {
                                    throw new Error('Product not in cart');
                                }
                            } catch (e) {
                              localErr = e;
                            }

                            return {
                                pageHTML: pageHTML,
                                err: localErr,
                                skuInCart: skuInCart,
                                checkoutLnkMsg: checkoutLnkMsg,
                                injectedSku: injectedSku
                            };

                        }, function (err, result) {
                            if (result.err) {
                                callback(err);
                                //return ph.exit();
                            }

                            fs.writeFileSync("./html_log.txt", result.pageHTML);
                            console.log('\r\n checkout - page.evaluate - injectedSku:  ' + result.injectedSku); 
                            console.log('\r\n checkout - page.evaluate - result.skuInCart:  ' + JSON.stringify(result.skuInCart));
                            console.log('\r\n checkout - page.evaluate - result.checkoutLnkMsg:  ' + result.checkoutLnkMsg);

                            callback(null);
                            //return ph.exit();
                        }, sku);
                    }, 1250);
                });
            });
        });
    });
});

【问题讨论】:

  • 你能粘贴你得到的确切错误吗?
  • 这并不是真正的错误。它只是来自网站的一个 html 响应,带有一条消息,例如“请在浏览器中启用 javascript 以便正确查看此页面。”
  • 嗯,你试过我下面建议的解决方案了吗?
  • 是的,请在答案旁边查看我的评论。

标签: javascript node.js web-scraping phantomjs


【解决方案1】:

替换

page.injectJs()

page.includeJs()

更新

var phantom = require('node-phantom');

phantom.create(function (err, ph) {
    ph.createPage(function (err, page) {

        page.get('settings', function(err, oldSettings) {
            //console.log('\r\n oldSettings:  ' + JSON.stringify(oldSettings));

            page.open('http://www.footlocker.com/shoppingcart/default.cfm?', function (err, status) {
                console.log(status);
                var sku = 234; // assign sku id here
                page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js', function (err) {
                    setTimeout(function() {     
                        page.evaluate(function (injectedSku) {
                            var localErr;
                            var skuInCart;
                            var checkoutLnkMsg;
                            var pageHTML;

                            try {              
                                pageHTML = $("html").html();

                                // Get 'SKUs' input element.
                                skuInCart = $('input[name="SKUs"]').val();

                                if (injectedSku === skuInCart) {
                                    var checkoutLnk = $('#cartAction_bottom a[alt="Checkout"');  

                                    checkoutLnk.on("click", function() {
                                        checkoutLnkMsg = '"' + checkoutLnk.href + '" link has been clicked';
                                    });

                                    checkoutLnk.click();            
                                } else {
                                    throw new Error('Product not in cart');
                                }
                            } catch (e) {
                              localErr = e;
                            }

                            return {
                                pageHTML: pageHTML,
                                err: localErr,
                                skuInCart: skuInCart,
                                checkoutLnkMsg: checkoutLnkMsg,
                                injectedSku: injectedSku
                            };

                        }, function (err, result) {
                            if (result.err) {
                                // callback(err);
                                //return ph.exit();
                            }

                            // fs.writeFileSync("./html_log.txt", result.pageHTML);
                            console.log('\r\n checkout - page.evaluate - injectedSku:  ' + result.injectedSku); 
                            console.log('\r\n checkout - page.evaluate - result.skuInCart:  ' + JSON.stringify(result.skuInCart));
                            console.log('\r\n checkout - page.evaluate - result.checkoutLnkMsg:  ' + result.checkoutLnkMsg);

                            // callback(null);
                            ph.exit();
                        }, sku);
                    }, 1250);
                });

            });
        });
    })
});

【讨论】:

  • 我已经尝试过了,但现在它卡在了这一行:page.includeJs(jqueryPath, function (err) {...
  • 我什至没有得到错误回复。回调函数永远不会被调用。
  • 而不是使用jqueryPath 使用'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js' 从CDN 提供您的jQuery。另外,在page.open() 之后,执行console.log('page opened', status)。 @bbeny
  • page.open() 后的“状态”返回“成功”,它一直都有。我只是没有将它包含在代码示例中,因为我认为解释问题不需要它。使用 CDN 加载 jquery 解决了代码卡住的问题。然而,现在我又回到了最初的问题,我收到一条消息“我们很抱歉!您必须在浏览器中启用 JavaScript 才能体验我们网站的所有功能并能够下订单。要继续,请通过更改浏览器的首选项来启用 JavaScript,然后刷新页面。”
  • 您是否尝试过以编程方式在页面上启用 javascript? settings.javascriptEnabled = true;?
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 2012-08-15
  • 2012-10-09
  • 2015-10-27
  • 2014-06-24
  • 1970-01-01
  • 2021-06-01
  • 2018-06-13
相关资源
最近更新 更多