【问题标题】:Cheerio selector doesn't select some elementsCheerio 选择器不选择某些元素
【发布时间】:2018-10-29 21:41:53
【问题描述】:

我正在尝试构建一个模块,使用 request-promise 和cheerio 在官方 NBA 盒子得分页面(例如https://stats.nba.com/game/0021800083)上进行一些基本的抓取。我写了如下测试代码:

const rp = require("request-promise");
const co = require("cheerio");

// the object to be exported
var stats = {};

const test = (gameId) => {
  rp(`http://stats.nba.com/game/${gameId}`)
    .then(response => {
      const $ = co.load(response);

      $('td.player').each((i, element) => {
        console.log(element);
      });

  });
};

// TESTING
test("0021800083");

module.exports = stats;

当我检查测试网页时,有多个td 标记实例与class="player",但由于某种原因,用cheerio 选择它们不起作用。

但是cheerio 确实成功选择了一些元素,包括a、script 和div 标签。

我们将不胜感激!

【问题讨论】:

    标签: javascript node.js request cheerio request-promise


    【解决方案1】:

    对于使用 AngularJS 构建的网站,使用诸如 request-promise 之类的抓取工具将不起作用。正如您可能期望的那样,您的响应不包含呈现的 HTML。您可以通过控制台记录响应来确认。为了正确抓取该站点,您可以使用 PhantomJS、Selenium Webdriver 等。

    一种更简单的方法是识别提供您所追求的数据的 AJAX 调用,然后将其抓取。为此,请访问该站点并在开发人员工具中打开“网络”选项卡。查看请求列表并确定哪个具有您所追求的数据。

    假设您关注表格中的玩家统计数据,我相信您正在寻找的是“0021800083_gamedetail.json”

    进一步阅读: Can you scrape a Angular JS website Scraping Data from AngularJS loaded page

    祝你好运!

    【讨论】:

    • 啊,我明白了。感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多