【问题标题】:Accessing values of JS Global variables in HTML with PhantomJS使用 PhantomJS 在 HTML 中访问 JS 全局变量的值
【发布时间】:2018-02-03 03:11:45
【问题描述】:

所以我有一段看起来像这样的 HTML:

<html>
  <body>
    <script>
      var foo = {
        bar: []
      };
    </script>
  </body>
</html>

我正在尝试使用 PhantomJS 来提取 foo.bar 的值。我该怎么做?到目前为止,我知道我的结构是这样的:

var webPage = require('webpage'); 
var page = webPage.create();
page.open(MY_URL, function(status) {
  var foo = page.evaluate(function(){
    //gets javascript from the HTML in the response
    // and extracts foo from there
  });
});

console.log(someVar);
phantom.exit();

【问题讨论】:

    标签: javascript jquery node.js web-scraping phantomjs


    【解决方案1】:

    您可以这样做,从幻像虚拟浏览器打开 url,并从带有幻像的网页中获取 javascript 返回值

    const phantom = require('phantom');
    
    
    openUrl = (req, res, next) => {
        let url = 'your url goes here';
        const {content, returnedFromPage} = await loadJsSite(url);
        return res.json(returnedFromPage);
    }
    
    loadJsSite = async (url) => {
      return new Promise( async (resolve, reject) => {
    
        const instance = await phantom.create();
        const page = await instance.createPage();
        await page.on('onResourceRequested', function(requestData) {
          console.info('Requesting', requestData.url);
        });
    
        const status = await page.open(url);
        var returnedFromPage = await page.evaluate(function() {
                return document.title;
            });
        const content = await page.property('content');
    
        await instance.exit();
    
        return resolve({content: content, returnedFromPage: returnedFromPage});
    
      })
    }
    

    【讨论】:

      【解决方案2】:

      看来你应该可以使用

      var foo = page.evaluate(function() {
        return window.foo
      })
      console.log('foo =', foo)
      

      【讨论】:

      • 我应该可以。但是,有一个问题。虽然我可以运行window.foo,但我无法访问foo.bar 数组,即使在我输入console.log(Object.keys(foo)); 时出现bar
      • @TheLegendOfCode 在这种情况下,您上面的示例似乎很糟糕
      • 我将return window.foo 更改为return JSON.stringify(window.foo),它说foo.bar 完全是空的。但是,当我将 URL 扔到 google 并在控制台中打印 foo.bar 时,它已经满了。
      • @TheLegendOfCode 显然在页面初始加载后填充了 foo.bar 数组。就像我说的,你的例子并不代表现实
      猜你喜欢
      • 2018-04-06
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2017-12-16
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多