
Python 爬虫项目上线后,多数问题不是出在代码语法上,而是集中在请求行为、反爬应对、数据提取和运行稳定性这几个环节。下面整理高频问题及对应解决思路,不讲理论,只说实际踩过的坑和怎么绕过去。
请求被拒绝:403、406、ConnectionResetError
网站返回 403 或直接断连,大概率是请求头缺失或特征太“机器人”。Requests 默认的 User-Agent 是 python-requests/2.x,几乎等于举手说自己是爬虫。
- 加真实浏览器的 User-Agent(比如 Chrome 最新版),并每次请求随机切换几个备选值
- 补全 Accept、Accept-Language、Referer(尤其是有 Referer 校验的站点)
- 禁用自动跳转(
allow_redirects=False),手动处理 302,避免被重定向到风控页 - 首次访问先 GET 主页,带 Cookie,再发目标请求;有些站会校验 Cookie 中的 session_id 或 _ts 字段
页面能打开但拿不到数据:JavaScript 渲染内容
用 requests.get() 拿到的 HTML 里没有商品价格、评论列表、动态加载的表格——基本可以确定内容由 JS 渲染生成。
- 先打开浏览器开发者工具,切到 Network → XHR/Fetch,刷新页面,找带数据的接口(常含 /api/、/v1/、?page= 等特征)
- 直接请求这些接口,比用 Selenium 跑整个页面更稳更快;注意参数加密(如 sign、timestamp)和请求头中的 token
- 实在绕不开 JS 渲染,优先选 Playwright(比 Selenium 启动快、兼容性好),别用 PhantomJS(已停更)
XPath 或 CSS 选择器失效:页面结构微调就崩
今天能取到标题,明天 class 名从 title 变成 titl__wrap,脚本直接报空。硬编码路径是最脆弱的一环。
立即学习“Python免费学习笔记(深入)”;
- 少依赖 class/id,多用层级关系 + 文本锚点,例如:
//div[contains(text(), '作者')]/following-sibling::div - 对关键字段做双重校验:先用 XPath 定位容器,再用正则从文本中抽数字或邮箱
- 加容错逻辑——获取不到时返回
None,而不是让程序抛异常中断;后续用 pandas.fillna() 或默认值兜底 - 定期用线上真实页面快照做回归测试,比靠人眼检查更可靠
爬着爬着就卡住或变慢:连接池、频率、代理问题
本地跑得飞快,部署到服务器后每 3 分钟卡死一次,或者响应时间从 200ms 涨到 8s。
- Requests 默认连接池只有 10,高并发时排队等连接;显式配置
pool_connections=20, pool_maxsize=20 - 别用
time.sleep()控频,改用 ratelimit 库或自建令牌桶,更精准且可跨线程共享 - 代理 IP 不稳定?优先选 HTTP 代理(比 SOCKS5 兼容性好),加自动检测机制:每次换代理前先 GET http://httpbin.org/ip,超时或返回异常就丢弃
- DNS 解析慢?在 requests Session 中设置
resolve_timeout=3,或用dnspython预查并缓存 IP
不复杂但容易忽略:日志要记清 URL、状态码、耗时、关键字段是否为空;异常别只 print,统一捕获写进 error.log,方便回溯哪一页触发了反爬规则。










