抓取页面 - 一个部分未使用 cheerio 加载

Scraping a page - one section isn't loaded using cheerio

本文关键字:一个 未使用 加载 cheerio 抓取      更新时间:2023-09-26

我正在用欢呼和流星刮一个社交网络。我可以登录,搜索一些信息并在页面上抓取我想要的信息。我正在提出请求并将 html 传递给欢呼,例如 刮流星.js.

问题是,页面的某些部分仅在我通过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 -->

In console.log(cherio.load(html)):

<div A>
    <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 -->

我假设 html 是由 cheerio 加载的,而无需执行脚本。我说的对吗?如果是这样,有没有办法让 cheerio 执行脚本,以便我可以在放置内容后抓取页面?

我使用以下选项发出 http 请求来模拟浏览器请求,所以我认为这不是请求本身的问题(无头浏览器不会让它变得更好)。

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();
  }
};

在抓取时需要考虑一些事情。

现代网站正在使用较新的框架,如Angular,EmberJS,这些网站HTML使用Javascript渲染(右键单击浏览器窗口,然后单击View Page source,你会看到没有任何HTML的裸html)

Meteor应用程序也是如此。

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

希望这有帮助

好吧,做了一些逆向工程,发现可以通过使用相同的标题选项等向另一个页面发出请求来检索卸载的部分。虽然流星.js使用节点.js幕后,也许答案是正确的,这不能按照我认为的方式完成。谁知道 (:

你是对的,你的方法只获取 HTML,而不模拟 JavaScript。要实现您想要的,请考虑使用 CasperJS 或 PhantomJS 等包。以下是一些如何执行此操作的示例:

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();
});

引用:

http://www.meteorpedia.com/read/PhantomJS

https://atmospherejs.com/gadicohen/phantomjs