Puppeteer - 滚动到 div 的底部
Puppeteer - Scroll to the bottom of a div
我正在尝试获取此页面上 div“Notes et références”中的所有链接:
https://fr.wikipedia.org/wiki/Barack_Obama
但我似乎没有合适的选择器。
我试过了,但没用:
const scrollable_section = '#mw-content-text > div.mw-parser-output > div.reference-cadre'
await page.evaluate(selector => {
const element = document.querySelector(selector);
element.scrollTop = element.offsetHeight;
}, scrollable_section);
有人可以帮助我吗?
我是 Puppeteer 的新手,所以我可能需要更多解释。
元素可滚动并不意味着您实际上需要滚动才能获取数据。它通常仅适用于需要处理滚动的 JS 驱动的动态提要。
在这种情况下,数据是静态可用的,因此除非您出于其他原因使用 Puppeteer,否则您可以使用更简单且可能更快的 Axios/Cheerio 组合来完成此操作。
更好的方法是使用维基百科的 API 而不是抓取数据。如果你抓取,请尊重他们对机器人的限制。
继续使用 Puppeteer,维基百科具有不嵌套部分的奇怪页面结构。选择 #Notes_et_références
后,您可以弹出到父节点 <h2>
,然后向前迭代几个兄弟节点,直到到达 .reference-cadre
元素(我硬编码了这种关系,但您可以如果目标是面向未来,请使用循环使其更具动态性)。
const puppeteer = require("puppeteer");
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const url = "https://fr.wikipedia.org/wiki/Barack_Obama";
await page.goto(url);
const links = await page.evaluate(() =>
[...document.querySelector("#Notes_et_références")
.parentNode
.nextElementSibling
.nextElementSibling
.querySelectorAll("a")]
.map(e => e.getAttribute("href"))
);
console.log(links.length, links.slice(0, 5));
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
输出:
809 [
'#cite_ref-prononciation_1-0',
'#cite_ref-prononciation_1-1',
'/wiki/Prononciation_de_l%27anglais',
'/wiki/Anglais_am%C3%A9ricain',
'/wiki/Transcription_phon%C3%A9tique'
]
我正在尝试获取此页面上 div“Notes et références”中的所有链接:
https://fr.wikipedia.org/wiki/Barack_Obama
但我似乎没有合适的选择器。 我试过了,但没用:
const scrollable_section = '#mw-content-text > div.mw-parser-output > div.reference-cadre'
await page.evaluate(selector => {
const element = document.querySelector(selector);
element.scrollTop = element.offsetHeight;
}, scrollable_section);
有人可以帮助我吗?
我是 Puppeteer 的新手,所以我可能需要更多解释。
元素可滚动并不意味着您实际上需要滚动才能获取数据。它通常仅适用于需要处理滚动的 JS 驱动的动态提要。
在这种情况下,数据是静态可用的,因此除非您出于其他原因使用 Puppeteer,否则您可以使用更简单且可能更快的 Axios/Cheerio 组合来完成此操作。
更好的方法是使用维基百科的 API 而不是抓取数据。如果你抓取,请尊重他们对机器人的限制。
继续使用 Puppeteer,维基百科具有不嵌套部分的奇怪页面结构。选择 #Notes_et_références
后,您可以弹出到父节点 <h2>
,然后向前迭代几个兄弟节点,直到到达 .reference-cadre
元素(我硬编码了这种关系,但您可以如果目标是面向未来,请使用循环使其更具动态性)。
const puppeteer = require("puppeteer");
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const url = "https://fr.wikipedia.org/wiki/Barack_Obama";
await page.goto(url);
const links = await page.evaluate(() =>
[...document.querySelector("#Notes_et_références")
.parentNode
.nextElementSibling
.nextElementSibling
.querySelectorAll("a")]
.map(e => e.getAttribute("href"))
);
console.log(links.length, links.slice(0, 5));
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
输出:
809 [
'#cite_ref-prononciation_1-0',
'#cite_ref-prononciation_1-1',
'/wiki/Prononciation_de_l%27anglais',
'/wiki/Anglais_am%C3%A9ricain',
'/wiki/Transcription_phon%C3%A9tique'
]