一、前言:为什么你的爬虫总是被拦截?

很多同学写爬虫,直接裸发请求:

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逆向、数据解密、分布式爬虫实战教程,欢迎点赞收藏关注!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐