使用Jsoup登录GitHub时旧CSS选择器报错如何解决?
问题根因
你的判断正确,报错是代码中使用的层级CSS选择器已经不匹配当前GitHub登录页的DOM结构导致的,旧选择器依赖的页面布局已被调整,select()方法无法找到对应元素,后续调用first()时会抛出空指针异常。
修复方案
不要使用强依赖页面层级的nth-child选择器,改用按隐藏表单字段name属性选择的写法,GitHub登录表单中存储校验token的隐藏字段name固定为authenticity_token,该选择器稳定性更高,不会随页面布局微调失效。
修改后的代码
try { // 本示例用到的常量 final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; final String LOGIN_FORM_URL = "https://github.com/login"; final String LOGIN_ACTION_URL = "https://github.com/session"; final String USERNAME = "你的GitHub账号"; final String PASSWORD = "你的GitHub密码"; // 访问登录页获取服务器下发的cookies Connection.Response loginForm = Jsoup.connect(LOGIN_FORM_URL) .method(Connection.Method.GET) .userAgent(USER_AGENT) .execute(); Document loginDoc = loginForm.parse(); // 存储响应html的文档对象 HashMap<String, String> cookies = new HashMap<>(loginForm.cookies()); // 保存cookies用于后续请求 // 准备登录凭证 // 已修复选择器,增加空判断避免空指针 Element tokenElement = loginDoc.selectFirst("input[name=authenticity_token]"); if (tokenElement == null) { throw new RuntimeException("未找到登录校验token,可能页面结构已更新或触发反爬验证"); } String authToken = tokenElement.attr("value"); HashMap<String, String> formData = new HashMap<>(); formData.put("commit", "Sign in"); formData.put("utf8", "✓"); formData.put("login", USERNAME); formData.put("password", PASSWORD); formData.put("authenticity_token", authToken); // 提交登录表单 Connection.Response homePage = Jsoup.connect(LOGIN_ACTION_URL) .cookies(cookies) .data(formData) .method(Connection.Method.POST) .userAgent(USER_AGENT) .execute(); System.out.println(homePage.parse().html()); } catch (IOException e) { e.printStackTrace(); }
注意事项
- 代码仅用于学习测试,GitHub有反爬机制,频繁发起登录请求会触发人机验证或IP限流,导致无法正常获取登录页内容。
- 实际生产环境如需调用GitHub能力,建议使用GitHub官方提供的OAuth接口完成登录授权,稳定性和安全性更高。
内容的提问来源于stack exchange,提问作者XxNoobSlayer69xX
相关产品推荐
相关产品推荐

