如何递归抓取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
相关产品推荐
相关产品推荐

