本地正常的URL抓取代码在远程服务器报HTTP Error 403: Forbidden
https://bithumb.cafe/notice触发403 Forbidden的原因及解决思路 兄弟,这种本地跑正常、远程服务器就报错的情况太常见了,大概率是目标网站的反爬机制盯上了你服务器的特征,跟代码本身关系不大。我给你拆解几个最可能的原因,再给点实用的解决思路:
核心原因分析
服务器IP被列入黑名单/限制列表
很多网站会专门针对云服务商(比如AWS、阿里云、DigitalOcean这类)的IP段做拦截,因为这些IP经常被批量爬虫滥用。你本地的家庭/办公IP属于普通民用段,不在反爬的重点监控范围内,但服务器IP可能已经被标记成“可疑爬虫IP”了。请求头太简陋,被识别为非浏览器请求
你加了User-Agent是好事,但第一个代码里用的cheese这种UA太随意了,完全不像正常浏览器的标识;就算第二个代码用了Mozilla/5.0,也只补了这一个头。现在很多网站会校验完整的请求头组合,比如Accept、Accept-Language、Referer、Connection这些,本地浏览器发起请求时会自动带上这些字段,而你远程的请求缺了这些,很容易被判定为爬虫。远程服务器的请求模式触发频率限制
本地测试一般是手动单次请求,频率很低;但远程服务器可能是定时批量运行,短时间内多次请求目标站,直接触发了对方的频率阈值,给你返回403。网络环境特征暴露
有些服务器会通过特定的代理出口IP访问,或者所在的IP段有大量爬虫活动记录,目标网站通过IP归属地、网络环境特征直接拦截了这类请求。
对应的解决思路
优化请求头,模拟真实浏览器
把请求头补全成和真实浏览器一致的样子,比如用Chrome的完整请求头:headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://bithumb.cafe/', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', }然后把这些头加到你的
Request对象里,替换掉之前简陋的UA。更换请求IP
- 试试切换服务器的IP(有些云服务商支持更换实例IP);
- 或者用代理IP池,每次请求换一个IP;
- 也可以给服务器挂个VPN,让请求从民用IP段发出。
降低请求频率
如果是定时任务,把请求间隔拉长,比如从每分钟一次改成每5分钟一次,避免短时间内多次触发反爬机制。尝试用无头浏览器模拟请求
如果上面的方法都不行,可以试试用Selenium或者Playwright这类工具,模拟真实浏览器的行为(包括渲染JS、自动生成完整请求头),这种方式更难被反爬识别,不过服务器资源消耗会高一点。
内容的提问来源于stack exchange,提问作者Rafa艂

