如何用Node.js和Puppeteer过滤含黑名单域名的抓取URL?
解决方案
核心思路是利用浏览器原生的URL对象提取每个链接的域名,与黑名单域名做匹配,过滤掉属于黑名单的URL,同时保留原链接的完整地址。
步骤1:预处理黑名单,提取纯域名
先把黑名单中的URL转换为统一的域名格式(比如将https://amazon.com转为amazon.com),用Set存储可提升匹配效率:
const blacklist = ['https://amazon.com']; // 转换为纯域名集合 const blacklistedDomains = new Set( blacklist.map(url => new URL(url).hostname) );
步骤2:过滤目标URL数组
遍历links数组,对每个URL提取域名后与黑名单对比,保留不在黑名单中的完整URL:
const linkSelector = 'div.yuRUbf > a'; let links = await page.$$eval(linkSelector, link => { return link.map(x => x.href); }); // 过滤逻辑 const filteredLinks = links.filter(link => { try { // 提取当前链接的域名 const currentDomain = new URL(link).hostname; // 检查是否在黑名单中,不在则保留 return !blacklistedDomains.has(currentDomain); } catch (error) { // 处理无效URL(比如格式错误、相对链接),这里默认保留,可按需调整 return true; } });
补充说明
URL对象能可靠处理各种合法URL格式,自动提取hostname。如果需要匹配主域名(包含子域名,比如www.amazon.com也需要过滤),可以改用后缀匹配:return !Array.from(blacklistedDomains).some(domain => currentDomain.endsWith(domain));- 加入
try-catch是为了避免无效URL导致整个过滤流程中断,可根据需求决定是否保留无效链接。
内容的提问来源于stack exchange,提问作者VebDav
相关产品推荐
相关产品推荐

