用node.js和cheerio刮OP.GG网站的问题

时间:2018-10-04 17:13:17

标签: node.js web-scraping cheerio

我是使用node.js和cheerio的初学者,并且会有一点帮助:D

我尝试抓取pubg.op.gg网站,使其具有两个简单的元素以在控制台中显示它们。 这是我的代码:

var url = "https://pubg.op.gg/user/K1uu"
var request = require('request');
var cheerio = require('cheerio');
var cheerioAdv = require('cheerio-advanced-selectors');

request(url, function(err, resp, body) {
    var $ = cheerio.load(body);
    var playerName = $('.player-summary__name');
    var playerNameText = playerName.text();
    console.log(playerNameText);

    var playerRank = $('.ranked-stats__rating-point');
    var playerRankText = playerRank.text();
    console.log(playerRankText);   
})

Image of values

我尝试使用类似这样的东西:“ Kyuu-1503” 玩家昵称的Kyuu值没问题,但是不可能有1503,但是div的名称是正确的! 我的问题在哪里?

谢谢大家!

2 个答案:

答案 0 :(得分:1)

嘿,欢迎来到StackOverflow!

该网站使用AJAX来获取评级,因此在加载HTML时,评级不可用,并且ranked-stats__rating-point类尚不存在。如果使用浏览器的开发人员工具进行检查,则可以看到它为3个不同的评分点请求了3个其他URL(唯一的区别是queue_size URL参数)。

https://pubg.op.gg/api/users/59fdce2bdf1b210001a9324d/ranked-stats?season=pc-2018-01&queue_size=1&mode=tpp
https://pubg.op.gg/api/users/59fdce2bdf1b210001a9324d/ranked-stats?season=pc-2018-01&queue_size=2&mode=tpp
https://pubg.op.gg/api/users/59fdce2bdf1b210001a9324d/ranked-stats?season=pc-2018-01&queue_size=4&mode=tpp

您应该可以这样要求第一等级:

var url = "https://pubg.op.gg/api/users/59fdce2bdf1b210001a9324d/ranked-stats?season=pc-2018-01&queue_size=1&mode=tpp";
var request = require('request');

request(url, function(err, resp, body) {
  var jsonData = JSON.parse(body);
  var score = jsonData['stats']['rating'];
  console.log(score);  // outputs "1520"
} );

但是,这些终结点无法提供用户名,因此,如果要获取任意用户名的API终结点,则需要为此找到另一个API终结点。

答案 1 :(得分:0)

嗨korsosa,谢谢您的回答! 是的,名称中有多个具有rank-stats__rating-point的元素。

这是您的代码的结果:

var playerRankText = playerRank [1] .text();
TypeError:无法读取未定义的属性“文本”