Jsoup爬取Kakuro棋盘异常:不同URL返回相同文档及尺寸适配问题
问题分析与解决方案
针对你遇到的两个核心问题(小尺寸棋盘爬取失败、爬取内容重复),可以从以下几个方向排查和解决:
一、小尺寸(3x3/4x4)爬取失败的原因与处理
验证URL正确性
先手动在浏览器中打开你构造的3x3/4x4尺寸对应的URL,确认页面是否能正常加载:- 如果手动访问也失败,说明你构造的URL不符合网站规则,需要重新核对小尺寸棋盘的URL参数(比如参数名是
size还是dim,取值格式是3x3还是3-3等)。 - 如果手动能正常打开,继续排查请求配置问题。
- 如果手动访问也失败,说明你构造的URL不符合网站规则,需要重新核对小尺寸棋盘的URL参数(比如参数名是
补充请求头信息
很多网站会校验请求的User-Agent、Accept等头信息,Jsoup默认请求头可能被识别为爬虫,导致小尺寸请求被拦截(大尺寸可能未触发该限制)。修改请求代码,添加完整请求头:try { Document document = Jsoup.connect(url) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") .header("Referer", "https://目标网站的主页URL") .timeout(10000) // 适当延长超时时间 .get(); // 后续处理逻辑 } catch (IOException e) { // 打印具体异常信息,定位问题 e.printStackTrace(); }捕获并分析异常
不要忽略Jsoup.connect().get()抛出的IOException,打印异常栈信息,根据异常类型针对性解决:- 403:大概率是反爬拦截,需要添加更多请求头或使用代理。
- 404:URL构造错误,重新核对。
- 解析错误:网站返回内容非标准HTML,可先获取响应文本再处理。
二、爬取内容重复的原因与处理
启用Cookie会话管理
目标网站可能通过Cookie维持会话,新棋盘生成依赖同一会话。Jsoup默认每次请求都是独立会话,因此每次返回初始棋盘。可以通过保存和复用Cookie解决:// 第一次请求获取会话Cookie Response initialResponse = Jsoup.connect(url) .userAgent(...) .execute(); Map<String, String> cookies = initialResponse.cookies(); // 后续请求新棋盘时复用Cookie Document newDocument = Jsoup.connect(newBoardUrl) .userAgent(...) .cookies(cookies) .get();检查是否为动态生成内容
如果网站新棋盘是通过前端JavaScript动态生成的,Jsoup无法执行JS,只能获取页面加载时的静态内容。这种情况下:- 打开浏览器开发者工具(F12),切换到Network面板,点击网站的"生成新棋盘"按钮,观察是否有AJAX请求获取新棋盘数据。
- 如果有,直接请求该AJAX接口(通常是JSON格式),比爬取HTML更高效。
添加防缓存参数
部分网站会对重复URL返回缓存内容,在请求URL后添加随机参数(如时间戳)避免缓存:String uniqueUrl = url + "?timestamp=" + System.currentTimeMillis(); Document document = Jsoup.connect(uniqueUrl) .userAgent(...) .get();
总结
目前的问题更倾向于目标网站的会话/反爬机制,加上小尺寸棋盘的URL可能存在构造误差。优先通过手动验证URL、补充请求头、复用Cookie这几个步骤排查,应该能解决大部分问题。
内容的提问来源于stack exchange,提问作者Clipz
相关产品推荐
相关产品推荐

