文章目录
(前排提醒:本文适用于正在用Python做数据抓取却突然被403拦路的新手同学!)
一、403 Forbidden到底是个啥?
最近有个小伙伴在群里急吼吼地求助:“我的爬虫昨天还能跑,今天突然就报urllib.error.HTTPError: HTTP Error 403: Forbidden了!!!”(是不是你也遇到过类似的抓狂时刻?)
这个错误翻译过来就是——服务器理解你的请求,但就是拒绝执行!(无情.jpg)常见于以下场景:
- 网站检测到你是爬虫(比如没有User-Agent)
- IP被拉黑(高频访问触发反爬)
- 需要登录才能访问(比如某些论坛)
- 触发了WAF防护(Web应用防火墙)
举个真实案例:某次我用requests.get(‘https://某个电商网站’)直接访问,结果返回403。但用浏览器打开却正常——这就是典型的反爬机制在起作用!
二、手把手教你七种破解大法
方法1:伪装浏览器身份(新手必会!)
import urllib.request
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
(划重点)User-Agent就像你的网络身份证!不加的话服务器一看就知道是Python脚本在访问~
方法2:添加Referer请求头
headers['Referer'] = 'https://www.google.com/' # 假装是从谷歌跳转过来的
某些网站会检查请求来源,这个操作相当于给你的请求"伪造"一个前导页面
方法3:使用代理IP池(高级操作)
proxy_handler = urllib.request.ProxyHandler({
'http': '123.45.67.89:8080',
'https': '123.45.67.89:8080'
})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
当你的IP被封锁时,代理IP就是你的救命稻草!(但免费代理经常不稳定,建议用付费服务)
方法4:模拟登录获取Cookies
import http.cookiejar
# 创建cookie容器
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
# 先登录(POST请求)
login_data = urllib.parse.urlencode({
'username': 'your_account',
'password': 'your_password'
}).encode()
opener.open(login_url, login_data)
# 再访问需要登录的页面
response = opener.open(protected_url)
(实战技巧)有些网站需要先登录获取凭证,这时候cookie处理就非常关键!
方法5:设置请求延迟(重要!)
import time
import random
time.sleep(random.uniform(1, 3)) # 随机等待1-3秒
太频繁的请求会被识别为攻击行为!适当加延迟能大幅降低被封概率
方法6:使用Selenium模拟浏览器
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
当常规方法都失效时,上终极大招——用真实浏览器访问(但资源消耗较大)
方法7:处理JavaScript渲染(进阶)
from requests_html import HTMLSession
session = HTMLSession()
r = session.get(url)
r.html.render() # 执行JavaScript
print(r.html.html)
有些网站的内容是通过JS动态加载的,这时候就需要能执行JavaScript的库
三、避坑指南(血泪教训总结)
- 不要用固定User-Agent!准备个UA池随机切换
- 控制请求频率!建议每秒不超过3次请求
- 及时处理异常!遇到403先暂停而不是继续硬刚
- 尊重robots.txt!有些网站明确禁止爬虫就不要强行抓取
四、终极调试技巧
当所有方法都试过还是403时,建议:
- 用curl命令测试:
curl -v URL
- 对比浏览器请求头(F12开发者工具)
- 使用Postman模拟请求
- 检查是否触发了人机验证(比如Cloudflare的5秒盾)
五、写在最后
最近帮朋友调试一个爬虫时,发现即使用上了所有方法还是403。最后发现是对方网站启用了TLS指纹验证(这种高级反爬就需要更复杂的对抗手段了)。所以网络爬虫本质上是场攻防战,需要持续学习新技术!
(超级重要)最后提醒:技术无罪,但请遵守法律法规和网站的使用条款!爬取公开数据时也要注意不要对目标服务器造成过大压力~