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

如何递归抓取URL子目录?求助实现网站子目录爬虫

解决Web Crawler抓取子目录及输出格式问题

Hey 各位技术伙伴,我来帮你搞定这个爬虫的问题!你当前的代码只能抓取初始URL的标题,没法自动遍历子目录链接,也没按你想要的格式输出。咱们一步步调整:

核心问题分析

你的现有代码只队列了单个初始URL,没有提取页面内的内部链接并加入爬取队列,也没实现URL和标题的对应输出格式。

修改后的完整代码

const Crawler = require("crawler");
const url = require("url"); // 用于解析和处理URL

// 目标域名,用来筛选内部链接
const targetDomain = "www.dintaifung.com.sg";
// 存储已爬过的URL,避免重复请求
const visited = new Set();

const c = new Crawler({
  maxConnections: 10,
  callback: function (error, res, done) {
    if (error) {
      console.log(`请求出错: ${error}`);
      done();
      return;
    }

    const $ = res.$;
    const currentUrl = res.request.uri.href; // 获取当前页面的完整URL
    const pageTitle = $("title").text().trim();

    // 按你期望的格式输出
    console.log(`Title of ${currentUrl} : ${pageTitle}`);

    // 提取页面内的所有<a>标签链接
    $("a").each((index, element) => {
      const href = $(element).attr("href");
      if (!href) return; // 跳过没有href的a标签

      // 把相对路径转成绝对路径
      const absoluteUrl = url.resolve(currentUrl, href);
      const parsedUrl = url.parse(absoluteUrl);

      // 筛选:只爬目标域名的链接,并且没被访问过
      if (parsedUrl.hostname === targetDomain && !visited.has(absoluteUrl)) {
        visited.add(absoluteUrl);
        c.queue(absoluteUrl); // 加入爬取队列
      }
    });

    done();
  }
});

// 初始化队列,标记初始URL为已访问
const startUrl = "https://www.dintaifung.com.sg/";
visited.add(startUrl);
c.queue(startUrl);

关键改进点说明

  • URL去重:用Set存储已访问的URL,避免重复爬取同一页面,节省资源
  • 内部链接筛选:通过url.parse判断链接的域名是否和目标一致,防止爬取外部网站
  • 相对路径转绝对路径:用url.resolve处理页面里的相对链接(比如/about.php),转成完整URL才能被爬虫正确请求
  • 输出格式匹配:用res.request.uri.href获取当前页面的完整URL,和标题按你要的格式拼接输出

这样运行后,爬虫就会自动遍历目标网站的子目录页面,输出你期望的格式啦!

内容的提问来源于stack exchange,提问作者scorezel789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:07:27