文章目录
一、这个错误让我差点摔键盘!
"urllib.error.HTTPError: HTTP Error 403: Forbidden"绝对是爬虫开发者最讨厌的错误之一!昨天我正愉快地写着爬虫脚本,突然就遇到了这个红色警告——就像在超市结账时发现忘带钱包一样让人抓狂(别问我怎么知道的)。
二、为什么服务器总对我"say no"?
403错误其实是服务器在说:“我知道你想干嘛,但就是不给你看!”。常见原因包括:
- 身份伪装失败:服务器发现你是爬虫而不是浏览器(User-Agent暴露了!)
- IP被拉黑:访问太频繁触发反爬机制(每分钟100次请求?过分了!)
- 权限不足:需要登录才能访问的页面(就像进VIP室要出示会员卡)
- 网站防护升级:Cloudflare等防护系统的拦截(道高一尺魔高一丈啊)
三、七个实战解决方案(亲测有效)
3.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',
'Referer': 'https://www.google.com/'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
(关键点)User-Agent要定期更新!建议收藏这个网站:https://user-agents.net/
3.2 动态IP代理方案(适合企业级爬虫)
proxy_handler = urllib.request.ProxyHandler({
'http': '123.123.123.123:8080',
'https': '123.123.123.123:8080'
})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
(避坑指南)免费代理存活时间短,建议使用付费服务。我之前用免费代理,结果IP被封得更快!
3.3 模拟登录保持会话(需要耐心)
import http.cookiejar
# 创建cookie容器
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
# 先登录(以知乎为例)
login_data = urllib.parse.urlencode({
'username': 'your_username',
'password': 'your_password'
}).encode('utf-8')
opener.open('https://www.zhihu.com/login', login_data)
# 现在可以访问需要登录的页面了
response = opener.open('https://www.zhihu.com/notifications')
(重要提示)记得处理验证码!有些网站还要处理CSRF token,建议先用浏览器手动登录抓包分析。
3.4 请求头终极伪装套餐
除了User-Agent,这些头信息也很关键:
headers = {
'Accept-Language': 'zh-CN,zh;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1'
}
(经验之谈)不同网站检测的重点不同,建议使用浏览器开发者工具查看正常请求的完整头信息。
3.5 请求频率控制(保命技巧!)
import time
import random
for page in range(1, 100):
# 随机等待1-3秒
time.sleep(1 + 2 * random.random())
# 发起请求...
(血的教训)曾经因为没加延迟,把人家网站搞崩了,结果IP被永久封禁!
3.6 使用Selenium模拟真人操作
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)
driver.get('https://target-website.com')
(注意)记得定期更新chromedriver版本,否则会被检测到!
3.7 终极方案:分布式爬虫+智能调度
# 使用Scrapy-Redis实现分布式
# settings.py配置
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://:password@host:port/db'
(进阶提示)配合IP池和User-Agent池使用,成功率提升200%!
四、防封禁的五个黄金法则(不看会后悔!)
- 做人要低调:控制请求频率,别像个DDoS攻击
- 伪装要彻底:Header、Cookie、IP全套伪装
- 协议要遵守:尊重robots.txt,别爬敏感数据
- 异常要处理:做好重试机制和错误日志记录
- 硬件要跟上:服务器性能决定爬虫效率
五、当所有方法都失效时…
试试这些偏方(成功率随缘):
- 修改MAC地址(适用于动态IP网络)
- 使用Tor匿名网络(速度慢但匿名性强)
- 联系网站管理员申请API接口(最合法的方式!)
最后说句掏心窝的话:爬虫虽好,可不要贪杯哦!去年有个朋友爬数据太狠,结果收到律师函…(你懂的)技术无罪,但使用需谨慎!