如何使用Puppeteer提取并导出含reddit.com域名的URL?
解决Puppeteer提取并导出reddit.com域名URL的问题
先修正你代码里的错误,再实现精准的筛选逻辑:
1. 修正代码笔误
你的代码里fs.writeFiexportle是拼写错误,需要改为fs.writeFile。
2. 实现正确的筛选逻辑
你之前的错误是直接把e.href.includes('reddit.com')的布尔结果赋值给href,导致后续无法跳转有效链接。正确的做法是先获取原始链接,判断域名后再决定是否处理:
完整修正后的代码
const puppeteer = require("puppeteer"); const fs = require('fs').promises; let browser; (async () => { browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] }); const [page] = await browser.pages(); await page.goto('https://old.reddit.com/', { "waitUntil": "networkidle0" }); const aElems = await page.$$('a.title'); const urls = []; for (let i = 0; i < aElems.length && i < 10; i++) { // 获取原始链接 const rawHref = await aElems[i].evaluate(e => e.href); // 用URL对象解析域名,判断是否属于reddit.com(含子域名) const urlObj = new URL(rawHref); if (urlObj.hostname.endsWith('reddit.com')) { const newPage = await browser.newPage(); await newPage.goto(rawHref, {waitUntil: "networkidle0"}); const finalUrl = await newPage.evaluate(() => document.location.href); console.log(finalUrl); urls.push(finalUrl); // 关闭新页面节省资源 await newPage.close(); } } await fs.writeFile('export.json', JSON.stringify(urls)); })() .catch(err => console.error(err)) .finally(() => browser?.close());
关键改进点
- 精准域名判断:用
URL对象的hostname属性,通过endsWith('reddit.com')匹配所有reddit子域名(如old.reddit.com、www.reddit.com),比直接用includes更严谨,避免误判其他含reddit.com字符串的非目标域名。 - 提前筛选:在打开新页面前就过滤非reddit链接,节省浏览器资源,提升效率。
- 资源回收:处理完每个链接后关闭对应新页面,避免内存占用过高。
- 修复文件写入方法:修正拼写错误的
writeFiexportle为writeFile。
内容的提问来源于stack exchange,提问作者Maria Mercedes
相关产品推荐
相关产品推荐

