Python爬虫合法需严守Robots协议、隐私禁区与请求红线:须用urllib.robotparser的can_fetch()实时校验、设真实User-agent、处理重定向与通配符、采用随机+指数退避延时、限制并发、禁存敏感信息并实时脱敏、复用连接防DDoS误判。

Python爬虫不违法的前提,是它既没越权、也没越界、更没越线——Robots协议是底线,隐私数据是禁区,请求节奏是红线。
如何用 urllib.robotparser 真正遵守 robots.txt
很多人以为“看了 robots.txt 就算守规矩”,其实不是。文件只是声明,can_fetch() 才是执行判断。不调用这个方法,等于没遵守。
- 必须在每次请求前调用
rp.can_fetch(user_agent, url),不能只检查一次首页 -
User-agent要写真实标识(比如"MyDataBot/1.0 (+https://example.com/bot)"),否则can_fetch()可能默认按*匹配,结果误判 - 注意重定向:如果目标 URL 302 跳转到
/private/user,而该路径在Disallow列表里,can_fetch()对原始 URL 返回True,但跳转后仍属违规 - 部分网站 robots.txt 使用通配符或正则(如
Disallow: /api/*/profile),robotparser不支持解析,需额外正则校验
为什么 time.sleep(1) 还是被封?关键在“随机+分布”
固定间隔是典型机器人行为。服务器看的不是“有没有停”,而是“停得像不像人”。time.sleep(1) 在多数电商站会被限流,因为真实用户不会每秒精准点一次。
- 改用
time.sleep(random.uniform(1.5, 4.2)),避开整数周期,降低模式识别概率 - 对同一域名连续请求超过 5 次,建议叠加指数退避:
sleep(2 ** attempt * random.uniform(0.8, 1.2)) - 并发请求数必须限制:Scrapy 默认
CONCURRENT_REQUESTS = 16,对中小站点过高,应设为1–3 - 别忽略 DNS 缓存和连接复用——频繁新建 TCP 连接比慢速请求更容易触发 WAF 的“连接风暴”规则
爬到手机号、身份证号怎么办?不是删掉就完事
法律上,“采集即风险”。哪怕页面公开显示,未经同意抓取并存储,已违反《个人信息保护法》第10条。更危险的是:你以为没存,但日志、临时文件、异常堆栈里可能残留。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
立即学习“Python免费学习笔记(深入)”;
- HTTP 日志中禁用
url和response.text全量记录,尤其避免打印含phone=或idcard=的调试信息 - 用正则在解析阶段就过滤:遇到
re.search(r'\b1[3-9]\d{9}\b', text)立即跳过整段内容,不进入后续 pipeline - 若必须保留评论类文本,用
re.sub(r'\b\d{17}[\dXx]|\b1[3-9]\d{9}\b', '[ID_REDACED]', text)实时脱敏,且不保留原始字段变量名 - 本地开发时禁用
pickle或json.dump存原始响应体——这些文件极易被误提交到 Git 或泄露到共享目录
防范 DDoS 误判:别把“合法爬取”做成“事实攻击”
服务器不区分你是研究者还是黑客,只看流量特征。一次跑 200 个线程扫全站商品页,哪怕加了 delay,只要集中在 3 分钟内完成,就大概率触发 Cloudflare 的 “Low Priority” 或阿里云的“CC 防护”拦截。
- 用
requests.Session()复用连接,减少 SYN 包冲击;禁用Connection: close - 设置
timeout=(3, 7):短连接超时防堆积,长读取超时防 hang 住线程 - 主动识别 429 响应:收到后立即暂停该域名 60 秒,并记录到独立限流队列,而非全局 sleep
- 避免 User-Agent 单一化:不要全用 Chrome 最新版,混入 Safari、Edge 甚至旧版 Firefox 的 UA,模拟真实设备多样性
真正难的不是写代码,是每次发请求前问自己:这个 URL 是 robots.txt 允许的吗?这段 HTML 里有没有我本不该看见的手机号?这次并发,会不会让对方运维半夜被告警叫醒?合规不是 checklist,是嵌进请求循环里的条件判断。

















