使用Apify/Puppeteer爬取时如何排除含指定词汇的URL
使用Apify/Puppeteer爬取时排除含特定词汇页面的实现方案
完全可以通过调整pseudoUrls配置实现需求,不需要额外修改其他爬取逻辑,具体实现方式有两种:
方案1:直接修改pseudoUrls匹配规则(适合简单关键词过滤场景)
pseudoUrls底层基于正则做URL匹配,原有配置里的baseurl + '[.*]'是匹配所有目标域名下的链接,只要把规则替换为带负向预查的正则,就能自动跳过包含指定关键词的URL。
以排除URL中包含foo的页面为例,修改后的代码如下:
await Apify.utils.enqueueLinks({ requestQueue, page, pseudoUrls: [ // 匹配所有baseurl开头、且全路径不包含foo的URL baseurl + '((?!foo).)*', ], });
规则扩展说明:
- 如果需要同时排除多个关键词,比如同时排除
foo、bar,把匹配规则改为baseurl + '((?!foo|bar).)*'即可 - 如果只需要排除路径段包含
foo的地址、允许查询参数带foo的地址入队,可以把规则调整为baseurl + '(?!/foo/)((?!/foo/).)*'匹配对应路径规则
方案2:用transformRequestFunction做自定义过滤(适合复杂规则场景)
如果过滤逻辑比较复杂,不想维护可读性差的长正则,可以用enqueueLinks自带的transformRequestFunction钩子做二次校验,示例代码如下:
await Apify.utils.enqueueLinks({ requestQueue, page, pseudoUrls: [ baseurl + '[.*]', ], transformRequestFunction: (request) => { // URL包含foo的请求直接返回null,不会加入爬取队列 if (request.url.includes('foo')) return null; // 这里还可以加其他自定义判断逻辑,比如按URL后缀、参数特征过滤 return request; } });
这种写法的灵活性更高,除了关键词匹配,还可以实现按文件后缀、参数特征、甚至预先提取页面片段特征做过滤的需求。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

