想象一下你第一次去银行办业务,柜员会要求你出示身份证件。没有证件,你连取号资格都没有。Headers和Cookies在网络世界里扮演着类似的角色——前者像是你递交给服务器的名片,后者则是服务器发给你的临时通行证。
我刚开始写爬虫时,经常遇到403 Forbidden错误。有次尝试抓取电商网站价格数据,连续失败十几次后才发现,问题出在没有设置User-Agent。后来加上这行代码,立刻就能获取数据了:
python复制headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
User-Agent只是Headers中最基础的字段,完整的请求头还包含这些关键信息:
而Cookies更像是服务器给你设置的"记忆碎片"。比如登录状态、浏览历史、购物车商品这些信息,都会通过Set-Cookie响应头存到你的浏览器里。下次请求时带上这些Cookies,服务器就能认出你是谁。
Chrome开发者工具是爬虫工程师的瑞士军刀。按F12打开后,切换到Network标签,刷新页面就能看到所有网络请求。点击任意请求,在Headers选项卡里就能找到完整的请求头和Cookies。
有个实用技巧:勾选"Preserve log"选项可以保留跳转页面的请求记录。我经常遇到这种情况——明明在首页看到了数据,但直接请求首页URL却拿不到内容。后来发现数据是通过AJAX异步加载的,必须捕获XHR请求才行。
直接复制粘贴Cookies是最简单的方式,但会遇到两个问题:一是Cookies会过期,二是不同账号需要不同Cookies。分享几个我在项目中验证过的方案:
方案一:使用Session对象自动管理
python复制import requests
session = requests.Session()
# 首次请求获取Cookies
login_res = session.post(login_url, data=credentials)
# 后续请求自动携带Cookies
profile_res = session.get(profile_url)
方案二:搭建Cookies池
对于需要多账号轮询的场景,可以用Redis存储多个账号的Cookies,每次请求前随机选取一个。关键是要实现Cookies有效性检测和自动更新机制。
方案三:模拟登录生成新Cookies
当检测到Cookies失效时,自动触发登录流程。这里有个细节要注意:很多网站的登录请求会包含CSRF Token,需要先从登录页提取。
固定不变的Headers就像总穿同一件衣服出门,很容易被识别。我的做法是准备多个User-Agent轮换使用:
python复制user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)"
]
headers = {
"User-Agent": random.choice(user_agents),
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Referer": generate_random_referer()
}
更专业的做法是分析真实用户的Headers特征。比如通过观察发现,Chrome浏览器通常会携带8-10个Headers字段,而爬虫往往只带2-3个。
有次爬取金融网站时,发现即使带上所有Cookies还是返回403。后来用Wireshark抓包对比才发现,浏览器会自动对Cookie值做URL编码,而我的爬虫直接发送了原始值。
最近两年,网站的反爬策略越来越智能。除了基础的Headers校验,还有这些高级检测方式:
遇到最棘手的情况是某社交平台的"隐形挑战"。正常访问时一切如常,但对爬虫会返回看似正常实则错误的数据。后来通过对比发现,响应里多了个x-request-type: bot的隐藏字段。
对于严肃的商业项目,我通常会构建多层防御体系:
一个典型的错误处理流程可以这样实现:
python复制try:
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 429:
handle_rate_limit()
elif "验证码" in response.text:
solve_captcha()
else:
process_data(response)
except Exception as e:
log_error(e)
change_proxy()
最后提醒一个容易被忽视的点:定时更新你的技术方案。去年还能用的爬虫,今年可能就因为网站升级了人机验证系统而失效。保持对新技术的学习和适应,才是应对反爬的长久之计。