javascript - 尝试使用 puppeteer 抓取网站并取回空对象
问题描述
我今天开始学习木偶戏,但遇到了一个问题。我试图创建一个 covid 跟踪器,我想从 worldometers 中获取信息。但是当我尝试取回信息时,它会返回一个包含空对象的数组。对象的数量与具有相同类别的标签数量相匹配,但它不显示任何信息。这是我的代码
const puppeteer = require("puppeteer")
async function getCovidCases(){
const browser = await puppeteer.launch({
defaultViewport: null,
headless: false,
slowMo: 250
})
const page = await browser.newPage()
const url = "https://www.worldometers.info/coronavirus/#countries"
await page.goto(url, {waitUntil: 'networkidle0'})
await page.waitForSelector(".navbar-nav", {visible: true})
const results = await page.$$eval(".navbar-nav", rows => {
return rows
})
await console.log(results)
}
getCovidCases()
有人知道该怎么做吗?
解决方案
根据选择器,我假设您在此步骤中对导航栏项目感兴趣。
const results = await page.$$eval(".navbar-nav", navBars => {
return navBars.map(navBar => {
const anchors = Array.from(navBar.getElementsByTagName('a'));
return anchors.map(anchor => anchor.innerText);
});
})
这会产生[ [ 'Coronavirus', 'Population' ] ]
并且可能对您有用。
如果$eval
您只期望一个元素并且$$eval
如果您期望多个元素,请使用。在回调中,您有对该 dom 元素的引用,但您不能直接返回它。如果您console.log
有任何内容,它不会显示在 nodejs 终端中,而是显示在浏览器终端中。您返回的内容将被发送回nodejs,并且它需要可序列化(我认为)。你得到的东西navBar
将被转换为一个空对象,而不是你想要的。这就是我映射它并将其转换为字符串 ( innerText
) 的原因。
如果要抓取其他数据,则应使用另一个选择器 ( .nav-bar
)。
推荐阅读
- python - 我想将函数变量初始化为先前输入的变量
- python - 当我将“recv()”与客户端套接字一起使用时,我的 python 程序冻结了,我该如何解决?
- python - 如何在 Python 的 PIL ImageFont 中指定 CJK 脚本的本地化形式?
- javascript - jQuery点击事件父id值
- python - TypeError:“用户”对象在尝试创建特定列表时不可下标
- tensorflow - Tensorflow:理解 tf.contrib.layers.instance_norm 图
- terraform - 仅当 vars.tf 文件中的变量设置为 true 时才创建 main.tf 资源
- homebrew - 在 Ubuntu 20.04.1 中使用 Homebrew 安装 LibIconv
- android - 删除导航栏上方不必要的空白
- c - C中 pow 的精度是否取决于参数的比例?