使用Scala Scraper爬取带Cookie网站遇403错误求助
爬取https://www.notary.org/find-notary-in-pa时遭遇403 Forbidden错误的排查与解决
环境与依赖
- Scala 2.13.1
- sbt 1.2.8
- 依赖库:
"net.ruippeixotog" %% "scala-scraper" % "3.0.0""org.jsoup" % "jsoup" % "1.15.3"
代码实现
object ScalaScraper extends App{ val ua = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" val browser = new JsoupBrowser(userAgent = ua) val cookies:Map[String, String] = Map( "ASPSESSIONIDQSBCTBBT"->"...hidden...", "SnapABugHistory"-> "2#", "_gid"-> "GA1.2.21330449.1684823122", "_ga"-> "GA1.1.1109375111.1684582576", "SnapABugUserAlias"-> "%23", "SnapABugVisit"-> "5#1684831262", "_ga_HQHD139BDT"-> "JCOIme7hJX0DSttMQQc3uvRb_icNZBQvH0g2tUvLxtc-1684911558-0-Abyg2SfcN4woQn15jTpYcn/kDeufSxKdqD8uD6jsYBEdQu4mY8UIMLQDE1mUtZg3nWETRgWkY2nRUFjIDBfgCcM=", "__cf_bm" -> "H3NvJ691o76iMBYHNIe4CwVATgmGmjYA9lWrNHhhKTc-1684927933-0-AZGonJ9RWnTVvooeEvt+Dyfg8WuONDrKXxETWrnQdtVceatbTl0OSQX/OgyGAwGikHr7UnHrW9H4IeOzzytXqJo=" ) browser.setCookies("https://www.notary.org/find-notary-in-pa", cookies) println("useragent " + browser.userAgent) val doc = browser.get("https://www.notary.org/find-notary-in-pa?search=1&page=1&zip=15037&radius=20&language=16") println("document is {}", doc) }
操作细节
已添加从浏览器控制台navigator.userAgent获取的User-Agent,以及从网络面板获取的Cookie,随后调用browser.get(url)发起爬取请求。
错误信息
useragent Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Exception in thread "main" org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=[https://www.notary.org/find-notary-in-pa?search=1&page=1&zip=15037&radius=20&language=16] at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:890) at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:829) at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:366) at net.ruippeixotog.scalascraper.browser.JsoupBrowser.executeRequest(JsoupBrowser.scala:85) at net.ruippeixotog.scalascraper.browser.JsoupBrowser.$anonfun$executePipeline$3(JsoupBrowser.scala:96) at scala.Function1.$anonfun$andThen$1(Function1.scala:85) at scala.Function1.$anonfun$andThen$1(Function1.scala:85) at net.ruippeixotog.scalascraper.browser.JsoupBrowser.get(JsoupBrowser.scala:39) at scalaSc$.delayedEndpoint$scalaSc$1(ScrapWithSelenium.scala:80) at scalaSc$delayedInit$body.apply(ScrapWithSelenium.scala:62)
疑问点
- 操作哪里有误?
- 添加User-Agent和Cookie的方式是否正确?
- 有没有其他方法避免403错误?
- 为何添加Cookie后网站仍拒绝爬取?
问题排查与解答
1. Cookie与User-Agent的问题
- Cookie有效性:你从浏览器复制的Cookie大概率已过期,尤其是
__cf_bm(Cloudflare反爬Cookie)、_ga系列分析Cookie都有有效期,过段时间就会失效。另外ASPSESSIONIDQSBCTBBT这类会话Cookie和原浏览器会话绑定,跨环境复用无法通过服务器的会话验证。 - User-Agent格式:User-Agent设置本身没问题,但部分网站会校验
Referer、Accept、Accept-Language等其他请求头,仅设置User-Agent不足以模拟真实浏览器。
2. 操作中的潜在问题
- URL编码问题:请求URL里的
&是HTML实体编码,实际应该用&,虽然jsoup可能自动处理,但可能导致参数解析异常触发拦截。 - Cookie作用域:调用
browser.setCookies时传入的是具体页面路径,建议把Cookie作用域设为https://www.notary.org,确保覆盖所有子路径的请求。
3. 避免403的其他方法
- 补充请求头:添加浏览器常用的请求头,模拟真实请求:
val headers = Map( "Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language" -> "en-US,en;q=0.5", "Referer" -> "https://www.notary.org/find-notary-in-pa" ) val doc = browser.get("https://www.notary.org/find-notary-in-pa?search=1&page=1&zip=15037&radius=20&language=16")( _.headers(headers) ) - 使用代理IP:单一IP频繁请求会触发拦截,用代理IP分散请求来源可缓解。
- 改用浏览器自动化工具:Selenium、Playwright这类工具完全模拟浏览器行为,能绕过大部分HTTP头部检测,但要设置合理的请求间隔。
- 检查robots.txt:先看
https://www.notary.org/robots.txt确认目标页面是否允许爬虫访问。
4. 添加Cookie仍被拒绝的原因
- Cookie过期或会话不匹配:服务器的会话验证不仅看Cookie值,还会绑定客户端IP、User-Agent等信息,跨环境复用浏览器Cookie会导致会话失效。
- Cloudflare防护:网站用了Cloudflare的Bot管理,
__cf_bm是临时验证Cookie,需要通过人机验证才能获取有效会话,单纯复制Cookie无法绕过这类防护,此时需用浏览器自动化工具完成验证后再爬取。
内容的提问来源于stack exchange,提问作者Zaryab Ali
相关产品推荐
相关产品推荐

