在 span 元素中单击 link 的 Puppeteer
Puppeteer clicking link in a span element
我正在尝试解析漫画网站并保存所有页面。我的代码通过保存图像的页面 运行。
我无法点击进入下一页的 link。我正在使用 Node 并使用 Puppeteer。我以为我可以只使用 document.querySelectorAll("span.next-prev-text")
来获得 link.
中的跨度
包括尝试获取下一页的相关代码,html我正在尝试点击下一章link。
<div class="col-md-6 prev-post">
<a class="" href="https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-vol-1-chapter-1-reborn/">
<span class="next-prev-text">PREVIOUS CHAPTER </span>
</a>
</div>
<div class="col-md-6 next-post">
<a class="" href="https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-chapter-3/">
<span class="next-prev-text">NEXT CHAPTER</span>
</a>
</div>
(async() => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
//starting page
await page.goto(
"https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-vol-1-chapter-1-reborn/"
);
console.log("page has loaded")
const chapter = await page.evaluate(() => {
const pages = Array.from(
document.querySelectorAll("img.aligncenter")
).map((image) => image.getAttribute("src"));
return pages
});
fs.writeFileSync("./data.json", JSON.stringify(chapter));
console.log("File is created!");
const nextPage = await page.evaluate(() => {
var obj = document.querySelectorAll("span.next-prev-text");
return obj[1];
})
await page.click(nextPage);
await page.waitForNavigation();
await browser.close();
} catch (error) {
console.log(error);
}
page.click()
只接受一个字符串选择器。我不知道为什么,但调用 page.click(".next-prev-text")
会抛出一条错误消息 Error: Node is either not visible or not an HTMLElement
.
解决方法是使用实际调用 document.querySelectorAll()
的 page.$$()
方法。它 returns 一个 ElementHandle
的数组,因此您可以简单地在 ElementHandle
.
上调用 click()
方法
我还添加了处理单击“下一章”时弹出页面的代码link。
这是要测试的完整代码。
const puppeteer = require('puppeteer');
const fs = require('fs');
(async () => {
try {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
//starting page
await page.goto(
"https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-vol-1-chapter-1-reborn/"
);
console.log("page has loaded")
const chapter = await page.evaluate(() => {
const pages = Array.from(
document.querySelectorAll("img.aligncenter")
).map((image) => image.getAttribute("src"));
return pages
});
fs.writeFileSync("./data.json", JSON.stringify(chapter));
console.log("File is created!");
const next = await page.$$(".next-prev-text");
const [popup] = await Promise.all([
new Promise((resolve) => page.once('popup', async p => {
await p.waitForNavigation({
waitUntil: 'networkidle0'
});
resolve(p);
})),
next[1].click()
]);
// do your job on the next page with 'popup' here
await browser.close();
} catch (error) {
console.log(error);
}
})();
我正在尝试解析漫画网站并保存所有页面。我的代码通过保存图像的页面 运行。
我无法点击进入下一页的 link。我正在使用 Node 并使用 Puppeteer。我以为我可以只使用 document.querySelectorAll("span.next-prev-text")
来获得 link.
包括尝试获取下一页的相关代码,html我正在尝试点击下一章link。
<div class="col-md-6 prev-post">
<a class="" href="https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-vol-1-chapter-1-reborn/">
<span class="next-prev-text">PREVIOUS CHAPTER </span>
</a>
</div>
<div class="col-md-6 next-post">
<a class="" href="https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-chapter-3/">
<span class="next-prev-text">NEXT CHAPTER</span>
</a>
</div>
(async() => {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
//starting page
await page.goto(
"https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-vol-1-chapter-1-reborn/"
);
console.log("page has loaded")
const chapter = await page.evaluate(() => {
const pages = Array.from(
document.querySelectorAll("img.aligncenter")
).map((image) => image.getAttribute("src"));
return pages
});
fs.writeFileSync("./data.json", JSON.stringify(chapter));
console.log("File is created!");
const nextPage = await page.evaluate(() => {
var obj = document.querySelectorAll("span.next-prev-text");
return obj[1];
})
await page.click(nextPage);
await page.waitForNavigation();
await browser.close();
} catch (error) {
console.log(error);
}
page.click()
只接受一个字符串选择器。我不知道为什么,但调用 page.click(".next-prev-text")
会抛出一条错误消息 Error: Node is either not visible or not an HTMLElement
.
解决方法是使用实际调用 document.querySelectorAll()
的 page.$$()
方法。它 returns 一个 ElementHandle
的数组,因此您可以简单地在 ElementHandle
.
click()
方法
我还添加了处理单击“下一章”时弹出页面的代码link。
这是要测试的完整代码。
const puppeteer = require('puppeteer');
const fs = require('fs');
(async () => {
try {
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
//starting page
await page.goto(
"https://tokyorevengersmanga.com/manga/tokyo-manji-revengers-vol-1-chapter-1-reborn/"
);
console.log("page has loaded")
const chapter = await page.evaluate(() => {
const pages = Array.from(
document.querySelectorAll("img.aligncenter")
).map((image) => image.getAttribute("src"));
return pages
});
fs.writeFileSync("./data.json", JSON.stringify(chapter));
console.log("File is created!");
const next = await page.$$(".next-prev-text");
const [popup] = await Promise.all([
new Promise((resolve) => page.once('popup', async p => {
await p.waitForNavigation({
waitUntil: 'networkidle0'
});
resolve(p);
})),
next[1].click()
]);
// do your job on the next page with 'popup' here
await browser.close();
} catch (error) {
console.log(error);
}
})();