如何让Puppeteer代码遵循robots.txt规则,是否有简易实现方案
已知在Scrapy框架中可以实现自动遵循robots.txt规则,但是我暂时没有找到Puppeteer中内置“遵循Robots协议”功能的简易方法,请问有没有简单的方案可以实现这个需求?
Puppeteer 遵循Robots协议的简易实现方案
Puppeteer官方没有内置遵循Robots协议的相关功能,你可以通过「独立解析robots规则 + 控制Puppeteer访问逻辑」的方式快速实现,不需要复杂的二次开发:
具体实现步骤
- 首先安装成熟的robots规则解析库,避免自己手写规则匹配逻辑,推荐用
robots-parser,安装命令:npm install robots-parser - 编写访问控制逻辑:
- 针对要访问的目标页面,先拼接出对应站点的robots.txt地址(例如目标页为
https://test.com/a.html,对应robots地址为https://test.com/robots.txt) - 发送普通HTTP请求获取robots.txt内容,用解析库加载规则
- 传入你设置的爬虫UA标识,判断待访问路径是否符合爬取规则
- 仅在规则允许爬取的前提下,再调用Puppeteer的
page.goto()方法访问对应页面,否则直接跳过该地址
- 针对要访问的目标页面,先拼接出对应站点的robots.txt地址(例如目标页为
最简示例代码
const puppeteer = require('puppeteer'); const robotsParser = require('robots-parser'); const fetch = require('node-fetch'); // 自定义你的爬虫UA const CUSTOM_UA = 'MyTestCrawler/1.0'; async function canCrawl(url) { const urlObj = new URL(url); const robotsUrl = `${urlObj.origin}/robots.txt`; try { const res = await fetch(robotsUrl); // 站点无robots.txt或请求返回异常时默认允许爬取 if (!res.ok) return true; const robotsContent = await res.text(); const robots = robotsParser(robotsUrl, robotsContent); return robots.isAllowed(url, CUSTOM_UA); } catch (e) { // 请求robots失败时的默认逻辑可根据自身需求调整 return true; } } async function run() { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 保持Puppeteer访问UA和robots规则校验UA一致 await page.setUserAgent(CUSTOM_UA); const targetUrl = 'https://example.com/test-path'; if (await canCrawl(targetUrl)) { await page.goto(targetUrl); // 此处补充你的页面操作逻辑 console.log('页面访问完成'); } else { console.log('该路径被robots.txt禁止爬取,跳过访问'); } await browser.close(); } run();
注意事项
- 解析robots规则时传入的UA,要和Puppeteer实际访问页面时设置的UA保持一致,避免规则匹配出错
- 可以给不同站点的robots规则增加缓存,不需要每次访问同站点下的页面都重复请求解析,提升运行效率
- 若有特殊合规需求,可以根据自己的场景调整robots请求失败时的默认处理逻辑(比如默认禁止爬取)
内容的提问来源于stack exchange,提问作者Mike Gifford
相关产品推荐
相关产品推荐

