我正在构建一个非常简单的抓取工具,应该将此website上的所有国家/地区都用掉。这些国家/地区位于“国内俱乐部”下拉列表中。
对于coutnries,我正在使用Nodejs
cheerio
(我不知道该库是否是一个不错的选择,我是一个非常初学者)。
这是我的代码:
const request = require('request');
var cheerio = require('cheerio');
var cheerioAdv = require('cheerio-advanced-selectors');
request('https://uk.soccerway.com/', function(err, resp, html)
{
if (!err)
{
const $ = cheerio.load(html);
var countriesMenu = cheerioAdv.find($, '#navbar-left > div:eq(2)');
$(countriesMenu).each(function()
{
console.log($(this).val());
});
}
});
基本上我声明了一个名为request
的常量,它执行所有请求GET
。然后我声明了另外两个包含库cheerio
和另一个名为cheerioAdv
的变量,并且应该允许我完成此任务。
cheerio advanced selector
应该允许我访问特定的标记位置。
根据该解释,我保存了navbar-left
的第二个div的内容,其中包含我想要的所有选项国家。
当我使用以下命令启动脚本时:node app.js
不打印任何内容。我还尝试在options
之后添加eq(2)
,我做错了什么?
答案 0 :(得分:0)
request
模块实际上并未包含#navbar-left
。如果您尝试console.log(html)
,您会注意到html数据有点奇怪。那是因为请求模块只能渲染初始的html体,而不能渲染javascript渲染的数据,如ajax或react / angular。尝试使用request
以外的其他模块。也许使用无头浏览器。 Nightmare
是一个很棒的人。
npm install nightmare --save
您使用梦魇实例拨打电话,然后将html代码传递给您的cheerio。以下是样本:
const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })
const cheerio = require('cheerio');
nightmare
.goto(url)
//do something in the chain to go to your desired page.
.evaluate(() => document.querySelector('html').outerHTML) // html selector
.then(function (html) {
cheerio.load(html);
// DO SOMETHING IN CHEERIO HERE
)
.catch(function (error) {
console.error('Error:', error);
});