如何从Google Play Store获取应用版本?Jsoup获取返回null求助
Google Play版本号爬取返回null问题排查与解决
我尝试了多种在线解决方案,但均未奏效,newVersion始终返回null。以下是我实现功能的Java代码:
protected String doInBackground(String... params) { if(!isFinishing()) { String currentVersion = AppUtil.getPackageVersion(UpdateActivity.this, appItem.mPackageName); try { newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + appItem.mPackageName + "&hl=en") .timeout(30000) .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") .referrer("http://www.google.com") .get() .select("div.hAyfc:nth-child(4) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)") .first() .ownText(); } catch (IOException e) { e.printStackTrace(); } } return newVersion; }
问题原因及解决办法
- CSS选择器依赖不稳定的DOM结构:Google Play页面会不定期更新,你使用的选择器完全依赖元素的固定位置(
nth-child(4)这类),一旦页面结构调整就会失效。换成基于文本内容的选择器更可靠:// 修改后的核心代码 Document doc = Jsoup.connect("https://play.google.com/store/apps/details?id=" + appItem.mPackageName + "&hl=en") .timeout(30000) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") .referrer("http://www.google.com") .get(); // 定位包含"Current Version"的元素,再取相邻的版本号文本 Elements versionNodes = doc.select("div:contains(Current Version) ~ div span"); if (!versionNodes.isEmpty()) { newVersion = versionNodes.first().ownText(); } - User-Agent过于老旧:你使用的是2007年的Firefox UA,Google可能会返回适配旧浏览器的特殊页面,或者直接拦截请求。换成主流现代浏览器的UA即可。
- 未处理元素不存在的情况:原代码中直接调用
first(),如果选择器没找到元素会触发空指针,同时newVersion保持null。必须先判断元素集合是否为空再取值。 - 网络访问限制:如果设备所在地区无法正常访问Google Play,请求会返回异常页面,导致选择器找不到目标元素。需要确认网络环境是否能访问该URL。
内容的提问来源于stack exchange,提问作者user19554057
相关产品推荐
相关产品推荐

