Python 数据抓取踩过的几个坑

2026-04-07Python爬虫

抓取看起来简单,真正费时间的从来不是写请求,而是对方不想让你稳定地拿到数据。把这些年踩的坑记一下。

请求层

requests 换到 httpx 之后省心很多,原生支持 HTTP/2 和异步。但并发别开太大,对小站点是公德问题,对大站点是封号问题。我一般用信号量把并发压在个位数。

import httpx, asyncio
sem = asyncio.Semaphore(5)
async def fetch(client, url):
    async with sem:
        r = await client.get(url, timeout=15)
        r.raise_for_status()
        return r.text

反爬

  • User-Agent 和 Referer 是基本礼貌,但别用一个 UA 打到底,准备一个小池子轮换。
  • 遇到 Cloudflare 之类的 JS 挑战,与其硬刚,不如找对方有没有公开 API 或 RSS——十有八九有。
  • 限速比换 IP 重要。大多数封禁是因为频率,不是因为身份。

稳定性

重试要带指数退避 + 抖动,否则一旦对方抖动,你的脚本会和它一起雪崩。解析尽量用容错的选择器,页面结构一变就 None 比抛异常友好得多。最后——抓下来的原始数据先落盘再解析,别让一个解析 bug 逼你重抓一整天。

← 返回首页