Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 抓取一页-没有使用cheerio加载一节_Javascript_Html_Meteor_Web Scraping_Cheerio - Fatal编程技术网

Javascript 抓取一页-没有使用cheerio加载一节

Javascript 抓取一页-没有使用cheerio加载一节,javascript,html,meteor,web-scraping,cheerio,Javascript,Html,Meteor,Web Scraping,Cheerio,我正在和cheerio和meteor建立一个社交网络。我可以登录,搜索一些信息,然后在页面上搜索我想要的信息。我正在请求并将html传递给cheerio 问题是,只有通过web浏览器加载页面时,才会出现页面的某个部分: 在浏览器中: <div A> <div B> <ul (...)> <li (...)>...</li> ... <l

我正在和cheerio和meteor建立一个社交网络。我可以登录,搜索一些信息,然后在页面上搜索我想要的信息。我正在请求并将html传递给cheerio

问题是,只有通过web浏览器加载页面时,才会出现页面的某个部分:

在浏览器中:

<div A>
    <div B>
        <ul (...)>
            <li (...)>...</li>
            ...
            <li (...)>...</li>
        </ul>
    </div> <-- end B -->
    <script id="NAME_1" type="fs/embed+m"></script>
    <script type="text/javascript">fs.dupeXHR("NAME_1","NAME_2",{"renderControl":"custom","templateId":"NAME_1"});</script>
</div> <-- end A -->

刮擦时你需要考虑很少的事情。

现代网站正在使用较新的框架,如Angular、EmberJS,这些网站的HTML是使用Javascript右键点击浏览器窗口呈现的,点击查看页面源代码,你会看到没有任何HTML的裸HTML

流星应用程序也是如此

因此,对于这些类型的内容,您需要使用无头浏览器或获取HTML内容并将其用于抓取


希望这会有所帮助,做了一些反向工程,发现卸载的部分可以通过使用相同的页眉等选项请求另一页来检索。
虽然meteor.js在幕后使用node.js,但可能答案是正确的,这不能像我想象的那样完成。谁知道呢:

您的方法只获取HTML而不模拟JavaScript,这是正确的。要实现您想要的,请考虑使用包或OR。以下是一些如何做到这一点的示例:

var phantomjs = Npm.require('phantomjs');
var spawn = Npm.require('child_process').spawn;
Meteor.methods({
  runTest: function(options){
    command = spawn(phantomjs.path, ['assets/app/phantomDriver.js']);
    command.stdout.on('data',  function (data) {
      console.log('stdout: ' + data);
    });
    command.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
    });
    command.on('exit', function (code) {
      console.log('child process exited with code ' + code);
    });
  }
});


var page = require('webpage').create();
page.open('http://github.com/', function() {
    console.log('Page Loaded');
    page.render('github.png');
    phantom.exit();
});
参考资料:


谢谢您的尝试,但由于我正在模拟web浏览器发出请求,我认为无头浏览器根本没有帮助。@在您的代码示例中,您可能是?只加载1个模拟web浏览器的资源,而无头浏览器(如PhantomJ)能够模拟完整的浏览器工作流,包括加载和执行脚本以及等待脚本完成。这不是cheerio做的事情。所以我认为这是有区别的。当浏览器打开页面时,当您的代码打开页面时,您应该能够通过比较网络流量来查看它。另见
Options = function (cookie) {
  this.headers = {
    "Accept": "*/*",
    "Connection": "keep-alive",
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36"
  };
  this.params = {};
  if (cookie) {
    this.headers.Cookie = cookie.get();
  }
};
var phantomjs = Npm.require('phantomjs');
var spawn = Npm.require('child_process').spawn;
Meteor.methods({
  runTest: function(options){
    command = spawn(phantomjs.path, ['assets/app/phantomDriver.js']);
    command.stdout.on('data',  function (data) {
      console.log('stdout: ' + data);
    });
    command.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
    });
    command.on('exit', function (code) {
      console.log('child process exited with code ' + code);
    });
  }
});


var page = require('webpage').create();
page.open('http://github.com/', function() {
    console.log('Page Loaded');
    page.render('github.png');
    phantom.exit();
});