《Python爬虫实战:请求伪装与反反爬——从被403到稳拿数据》
2026/7/5 13:35:46 网站建设 项目流程

一、前言

前两篇讲了怎么发请求、怎么找接口。但有读者跟着跑完发现:一模一样的代码,自己跑就被 403 拦了——因为目标网站有反爬。

这很正常。反爬是爬虫路上绕不过的坎。这篇文章不讲玄学,直接给能用的方法。

二、最常见的三种反爬与应对

1. User-Agent 检测

请求头中的 User-Agent 如同请求的"身份证",服务器通过它可以判断访问者是否为真实浏览器。requests 库默认的 UA 为python-requests/2.x,特征明显,极易被识别为非真人访问。

应对:每次请求换一个常见的浏览器 UA。

2. 请求频率限制

一秒钟发十几二十个请求,服务器直接拉黑 IP。

应对:每次请求之间随机等 1-3 秒。

3. Cookie/Session 检测

有些网站需要先访问首页拿到 Cookie,再访问其他页面才给数据。跳过这一步直接请求详情页,返回空白。

应对:用requests.Session()自动管理 Cookie。

为了方便读者快速定位和解决反爬问题,下面是一个遇到 403 等反爬错误时的排查流程图:

flowchart TD A[请求被拒(403/429等)] --> B{检查 User-Agent} B -->|UA 可疑| C[更换为常见浏览器 UA] B -->|UA 正常| D{检查请求频率} D -->|频率过高| E[添加随机延迟(1-3秒)] D -->|频率正常| F{检查 Cookie/Session} F -->|缺少 Cookie| G[先访问首页获取 Cookie] F -->|Cookie 正常| H[其他原因排查] C --> I[重新发起请求] E --> I G --> I I --> J{是否成功?} J -->|是| K[✅ 请求成功] J -->|否| L[🔄 返回第一步继续排查]

该流程图概括了本文介绍的三种主要反爬机制的排查路径。按照这个顺序检查,可以解决大部分因 UA、频率、Cookie 导致的访问问题。

三、代码实战:带伪装能力的爬虫模板

把上面三种应对手段打包成一个通用工具函数,以后爬任何网站都能复用:

import requests import random import time # 常见的浏览器 User-Agent 池 USER_AGENTS = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0", ] def create_session(): """创建一个带伪装能力的请求会话""" session = requests.Session() session.headers.update({ "User-Agent": random.choice(USER_AGENTS), "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", }) return session def safe_request(url, session=None, retries=3): """带重试和延时的安全请求函数""" if session is None: session = create_session() for attempt in range(retries): try: time.sleep(random.uniform(1, 2.5)) response = session.get(url, timeout=10) if response.status_code == 200: return response elif response.status_code == 403: print(f"被拦了(第{attempt+1}次重试)...") session.headers.update({ "User-Agent": random.choice(USER_AGENTS) }) continue else: print(f"状态码异常:{response.status_code}") continue except Exception as e: print(f"请求异常:{e}") continue return None # 使用示例 session = create_session() resp = safe_request("http://books.toscrape.com", session) if resp: print("请求成功!")

四、一个省事的技巧:从浏览器直接复制请求

每次手动写 headers 很麻烦。有个省事的方法:

打开开发者工具(F12)→ Network 标签 → 刷新页面 → 找到请求 → 右键 → Copy → Copy as cURL → 粘贴到 curlconverter.com,直接生成完整的 Python 代码。

Cookie、Referer 全部自动带好,比自己写省事十倍。

五、总结

反爬不可怕,常见的手段就那几样。核心就三点:

  1. 换 UA —— 别让服务器认出你是爬虫
  2. 慢一点 —— 别把自己刷进黑名单
  3. 管好 Cookie —— 模拟正常用户浏览流程

掌握了这三招,大部分网站都能安安稳稳地爬。

技术交流详见主页简介~

版权声明:​本文为CSDN博主「轩&hyx」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询