使用 node.js 和 cheerio 抓取 OP.GG 网站时出现问题
Problem with scraping OP.GG website with node.js and 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);
})
我试着做这样的事情:"Kyuu - 1503"
playernickname 的 Kyuu 值没有问题,但不可能有 1503,但是 div 的名称是正确的!
我的问题在哪里?
谢谢你们!!
您好,欢迎来到 Whosebug!
该网站使用 AJAX 获取评分,因此当加载 HTML 时,评分不可用,并且 ranked-stats__rating-point
class 尚不存在。如果你用浏览器的开发者工具检查它,你可以看到它为 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 端点。
您好 korsosa,感谢您的回答!
是的,有多个名称为 ranked-stats__rating-point 的元素。
有你的代码的结果:
var playerRankText = playerRank[1].text();
类型错误:无法读取未定义的 属性 'text'
我是 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);
})
我试着做这样的事情:"Kyuu - 1503" playernickname 的 Kyuu 值没有问题,但不可能有 1503,但是 div 的名称是正确的! 我的问题在哪里?
谢谢你们!!
您好,欢迎来到 Whosebug!
该网站使用 AJAX 获取评分,因此当加载 HTML 时,评分不可用,并且 ranked-stats__rating-point
class 尚不存在。如果你用浏览器的开发者工具检查它,你可以看到它为 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 端点。
您好 korsosa,感谢您的回答! 是的,有多个名称为 ranked-stats__rating-point 的元素。
有你的代码的结果:
var playerRankText = playerRank[1].text();
类型错误:无法读取未定义的 属性 'text'