You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:35:13