一、前言:为什么你的爬虫总是被拦截?
很多同学写爬虫,直接裸发请求:
res = requests.get(url)看起来代码没问题,但是大部分网站直接返回403或者直接无数据。
核心原因:
requests 默认请求头的 UA 是:
python-requests/xxx
服务器一眼就能识别出这是程序爬虫,直接拦截、拒绝访问。
想要正常爬取数据,第一步必须学会UA伪装,模拟真实浏览器访问行为。
二、什么是 User-Agent?
User-Agent(简称 UA)是 HTTP 请求头中的一个字段,用于告诉服务器:当前访问者是什么设备、什么浏览器、什么系统。
正常用户访问 = 浏览器UA
爬虫裸访问 = python-requests 标识
网站风控优先拦截特征明显的爬虫UA,这是最基础的反爬机制。
三、静态UA伪装(入门必学)
直接模拟 Chrome 浏览器请求头,适用于大部分简单爬虫场景,解决绝大多数 403 问题。
完整可运行代码
import requests # 伪装浏览器UA headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url = "https://httpbin.org/headers" # 带请求头访问 res = requests.get(url, headers=headers) print(res.text)效果说明
此时服务器识别你的访问为:Chrome浏览器正常用户访问,不再触发基础拦截。
四、单一UA的弊端
很多同学加了固定UA后,短期能爬,爬一会又被封:
长时间同一UA高频请求,特征固定
风控系统会标记异常高频访问
依旧会出现封禁、验证码、限流
解决办法:搭建UA池,随机切换浏览器标识。
五、进阶:随机UA池实战(稳定防封)
整合主流 Chrome、Edge、Firefox 浏览器UA,每次请求随机选取,模拟多设备、多用户访问,大幅降低爬虫特征。
import requests import random # 搭建UA池 ua_list = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/119.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/118.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Edg/119.0.0.0 Safari/537.36" ] # 随机获取UA def get_random_headers(): ua = random.choice(ua_list) headers = { "User-Agent": ua } return headers # 爬虫请求方法 def spider_get(url): try: res = requests.get(url, headers=get_random_headers(), timeout=10) print("当前UA:", res.request.headers["User-Agent"]) return res except Exception as e: print("请求异常:", e) # 测试 if __name__ == "__main__": spider_get("https://httpbin.org/headers")六、高阶优化:全套请求头伪装(高仿真人)
仅仅伪装 UA 还不够,高级风控会校验Accept、Referer、Accept-Language等字段。
完整高仿浏览器请求头,几乎无法识别是爬虫:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9", "Referer": "https://www.baidu.com/", "Connection": "keep-alive" }Referer:模拟从百度跳转进入目标网站,伪装访问来源,反爬效果大幅提升。
七、结合随机延时,彻底杜绝封IP
UA伪装 + 随机休眠 = 新手最强稳定爬虫组合
import time import random # 随机休眠 1-3秒 time.sleep(random.uniform(1, 3))避免固定频率请求,完美模拟人类浏览节奏。
八、常见问题总结
1. 加了UA还是403?
解决:补齐全套 headers、增加 referer、开启随机延时。
2. 爬一会就失效?
解决:使用随机UA池,不要固定单一UA。
3. 频繁出现验证码?
解决:降低爬取频率、搭配代理IP轮换使用。
九、总结
UA伪装是所有爬虫的第一道防线,也是成本最低、效果最好的反拦截手段。
新手爬虫被 403、拦截、空白数据,优先检查是否带请求头、是否随机UA、是否高频请求。
稳定爬虫公式:随机UA池 + 完整请求头 + 随机延时 + 代理IP轮换。
后续持续更新爬虫反爬、JS逆向、数据解密、分布式爬虫实战教程,欢迎点赞收藏关注!