Scala Jsoup爬虫遇Cloudflare 403:无法获取目标站点数据求助
解决Cloudflare反爬导致的403 Forbidden问题
这不是单纯的Cookie问题——目标站点启用了Cloudflare人机验证机制,你的请求被识别为非人类访问,因此返回403并展示验证页面。Cookie是Cloudflare验证流程的一部分,但仅靠手动设置Cookie无法绕过完整的验证逻辑。
以下是具体解决思路:
1. 模拟真实浏览器请求头
Cloudflare会通过请求头识别爬虫,必须配置完整的浏览器级请求头,避免被标记:
- 核心要添加的Header包括
User-Agent(用主流浏览器的最新标识)、Accept、Accept-Language、Referer等 - Akka Http中的配置示例:
import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.model._ val browserHeaders = List( `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(MediaRange.parse("text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8").get), `Accept-Language`(LanguageRange("en-US"), LanguageRange("en;q=0.5")), Referer("https://www.notary.org/") )
2. 处理Cloudflare人机验证
Cloudflare的验证需要完成交互(如点击验证按钮、滑块验证)才能获取有效cf_clearance Cookie,纯后端Scala代码无法直接处理可视化验证,推荐两种合规方案:
- 方案一:使用无头浏览器模拟交互
用Playwright或Selenium的Scala绑定,启动无头浏览器访问目标页面,等待验证完成后提取cf_clearance和站点Cookie,再将这些Cookie带入Akka Http的后续请求。这种方式最贴近真实用户行为,成功率最高。 - 方案二:查找站点API接口
通过浏览器开发者工具的Network面板,查看搜索操作触发的XHR/Fetch请求,直接调用后端API获取数据——很多站点的搜索结果会通过AJAX加载,这类API可能不会触发Cloudflare页面级验证。
3. 控制请求频率
即使通过验证,频繁请求仍会被Cloudflare拦截,需添加随机延迟模拟人类访问节奏,比如每次请求间隔2-5秒:
import scala.util.Random import java.util.concurrent.TimeUnit // 随机延迟2-5秒 TimeUnit.SECONDS.sleep(Random.nextInt(4) + 2)
注意事项
- 确保爬虫行为符合目标站点的
robots.txt和服务条款,避免法律风险 - Cloudflare的验证规则会持续更新,需定期调整请求策略
内容的提问来源于stack exchange,提问作者Zaryab Ali
相关产品推荐
相关产品推荐

