《Python爬虫实战:请求伪装与反反爬——从被403到稳拿数据》

📅 2026/7/5 13:35:47
《Python爬虫实战:请求伪装与反反爬——从被403到稳拿数据》
一、前言前两篇讲了怎么发请求、怎么找接口。但有读者跟着跑完发现一模一样的代码自己跑就被 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/xhtmlxml,application/xml;q0.9,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, }) return session def safe_request(url, sessionNone, retries3): 带重试和延时的安全请求函数 if session is None: session create_session() for attempt in range(retries): try: time.sleep(random.uniform(1, 2.5)) response session.get(url, timeout10) if response.status_code 200: return response elif response.status_code 403: print(f被拦了第{attempt1}次重试...) 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 全部自动带好比自己写省事十倍。五、总结反爬不可怕常见的手段就那几样。核心就三点换 UA —— 别让服务器认出你是爬虫慢一点 —— 别把自己刷进黑名单管好 Cookie —— 模拟正常用户浏览流程掌握了这三招大部分网站都能安安稳稳地爬。技术交流详见主页简介~版权声明​本文为CSDN博主「轩hyx」的原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接及本声明。