通过jsoup抓取谷歌商店评分

文章目录

    • 背景
    • 实现
      • 是否下架预警
      • 评分
    • 总的工具类,测试

背景

在谷歌上面发布包,有时候要看看评分,有时候会因为总总原因被下架,希望后台能够对评分进行预警,和下架预警

实现

测试地址: https://play.google.com/store/apps/details?id=com.tencent.mm
通过jsoup解析页面,然后获取评分;
这是获取评分的:
image.png

而判断包是否下架就直接判断返回的code码是否大于300,就算作下架了;

是否下架预警

public static void offline(String url) {// 1.解析网页(jsoup 解析返回的对象是浏览器Document对象)HttpResponse response = null;try {response = getHttpResponse(url);if (response.getStatusLine().getStatusCode() >= 300) {// 下架通知log.error("谷歌App检测下架: {} ", url);}log.error("谷歌App检测下架: code码{} ", response.getStatusLine().getStatusCode());} catch (Exception e) {log.error("谷歌App检测下架!!!url:{},异常:{}", url, e);//throw new RuntimeException(e);} finally {if (Objects.nonNull(response)) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {//throw new RuntimeException(e);}}}}

评分

public static Integer score(String url) {// 1.解析网页(jsoup 解析返回的对象是浏览器Document对象)HttpResponse response = null;try {response = getHttpResponse(url);if (response.getStatusLine().getStatusCode() < 300) {Document document = Jsoup.parse(EntityUtils.toString(response.getEntity(), Charsets.UTF_8));// google商店的评分classElements tt9eCd = document.getElementsByClass("TT9eCd");if (CollectionUtils.isEmpty(tt9eCd)) {log.debug("google商店评分数据监控没有评分app:{}", url);return null;}return (int) (Double.parseDouble(tt9eCd.get(0).textNodes().get(0).text()) * 10);}} catch (Exception e) {e.printStackTrace();log.error("google商店评分数据监控异常!!!url:{},异常:{}", url, e.toString());//throw new RuntimeException(e);} finally {if (Objects.nonNull(response)) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {//throw new RuntimeException(e);}}}return null;}

总的工具类,测试

package com.study.springbootplus.util;import com.google.common.base.Charsets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.io.IOException;
import java.util.Objects;/*** @ClassName GooglePlayUtil* @Author yida* @Date 2023-08-21 17:04* @Description GooglePlayUtil*/
@Slf4j
public class GooglePlayUtil {private static final HttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build()).build();public static void main(String[] args) {System.setProperty("java.net.useSystemProxies", "true");offline("https://play.google.com/store/apps/details?id=com.tencent.mm");System.out.println("返回的分数:" + score("https://play.google.com/store/apps/details?id=com.tencent.mm"));}public static void offline(String url) {// 1.解析网页(jsoup 解析返回的对象是浏览器Document对象)HttpResponse response = null;try {response = getHttpResponse(url);if (response.getStatusLine().getStatusCode() >= 300) {// 下架通知log.error("谷歌App检测下架: {} ", url);}log.error("谷歌App检测下架: code码{} ", response.getStatusLine().getStatusCode());} catch (Exception e) {log.error("谷歌App检测下架!!!url:{},异常:{}", url, e);//throw new RuntimeException(e);} finally {if (Objects.nonNull(response)) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {//throw new RuntimeException(e);}}}}public static Integer score(String url) {// 1.解析网页(jsoup 解析返回的对象是浏览器Document对象)HttpResponse response = null;try {response = getHttpResponse(url);if (response.getStatusLine().getStatusCode() < 300) {Document document = Jsoup.parse(EntityUtils.toString(response.getEntity(), Charsets.UTF_8));// google商店的评分classElements tt9eCd = document.getElementsByClass("TT9eCd");if (CollectionUtils.isEmpty(tt9eCd)) {log.debug("google商店评分数据监控没有评分app:{}", url);return null;}return (int) (Double.parseDouble(tt9eCd.get(0).textNodes().get(0).text()) * 10);}} catch (Exception e) {e.printStackTrace();log.error("google商店评分数据监控异常!!!url:{},异常:{}", url, e.toString());//throw new RuntimeException(e);} finally {if (Objects.nonNull(response)) {try {EntityUtils.consume(response.getEntity());} catch (IOException e) {//throw new RuntimeException(e);}}}return null;}public static HttpResponse getHttpResponse(String url) throws Exception {return httpClient.execute(new HttpGet(url));}}

测试结果:
返回的分数:36

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习----Day07

函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫做…

苍穹外卖(五) 微信小程序

项目应用: 使用微信小程序完成客户端开发并基于微信登录实现小程序的登录功能如果是新用户需要自动完成注册 微信小程序开发 介绍 小程序是一种新的开放能力&#xff0c;开发者可以快速地开发一个小程序。可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验…

C# 图解教程 第5版 —— 第3章 C# 编程概述

文章目录 3.1 一个简单的 C# 程序&#xff08;*&#xff09;3.2 标识符3.3 关键字3.4 Main&#xff1a;程序的起始点&#xff08;*&#xff09;3.5 空白3.6 语句&#xff08;*&#xff09;3.7 从程序中输出文本3.7.1 Write&#xff08;*&#xff09;3.7.2 WriteLine&#xff08…

【C++进阶】:C++类型转换

C类型转换 一.C语言里的类型转换二.C语音类型转换的一些弊端三.C的四种类型转换1.static_cast2.reinterpret_cast3.const_cast4.dynamic_cast 一.C语言里的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者…

Python实验三

1&#xff1a;编程统计英文句子中的单词出现的次数。 要求&#xff1a;输出结果为按照单词在句子中出现的次数降序排列。 提示&#xff1a;用split&#xff08;&#xff09;拆分字符串 # 1&#xff1a;编程统计英文句子中的单词出现的次数。 # 要求&#xff1a;输出结果为按照…

Dijkstra求最短路(图解)

你好&#xff0c;我是Hasity。 今天分享的内容&#xff1a;Dijkstra求最短路这个题目 Dijkstra求最短路I 题目描述 给定一个 n个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出 1 号点到 n号点的最短距离&#xff0c;如果无…

Windows 中环境变量的查看与设置

接触了LLM应用开发后&#xff0c;经常要用到环境变量的设置&#xff08;openAI apikey啥的&#xff09; 但是老忘记&#xff0c;今天来学习和总结一下 主要用到以下几种&#xff1a;使用 PowerShell、CMD 和 Python 来查看和设置环境变量 文章目录 1. PowerShell查看环境变量&a…

【Linux】HTTP协议

文章目录 &#x1f4d6; 前言1. 认识URL && 引入http协议2. http协议格式2.1 宏观格式&#xff1a;2.2 实验演示&#xff1a; 3. http的方法3.1 GET方法&#xff1a;3.2 POST方法&#xff1a;3.3 GET vs POST&#xff1a; 4. HTTP的报头和状态码5. http的cookie5.1 htt…

估算总体标准差的极差均值估计法sigma = R/d2

总体标准差的估算值可以通过将平均极差除以合适的常数因子d2来计算。这个估算方法是用于估算总体标准差的一种常见方法&#xff0c;尤其在质量控制和过程监控中经常使用。 总体标准差的估算值 (平均极差) / d2 其中&#xff1a; "总体标准差的估算值" 表示用极差…

Floorplanning with Graph Attention

Floorplanning with Graph Attention DAC ’22 目录 Floorplanning with Graph Attention摘要1.简介2.相关工作3.问题公式化4. FLORA的方法4.1 解决方案概述4.2 C-谱聚类算法 4.3 基于GAT的模型4.4 合成训练数据集生成 摘要 布图规划一直是一个关键的物理设计任务&#xff0…

宝塔面板部署express以及MySql项目

第一次在宝塔面板上部署express和MySql项目&#xff0c;部署过程一直跑不通接口&#xff0c;特此记录一下。 在部署的时候&#xff0c;建议第一步把数据库MySql给跑通&#xff0c;中间好多原因是由于数据库的原因给引起的。 一.连接数据库 &#xff08;1&#xff09;在宝塔面…

深入promise

深入promise 我们可能知道如何使用 Promise&#xff0c;但是我们知道它们实际上是如何工作的吗&#xff1f; 为了让每个人都了解Promise&#xff0c;让我们从基础开始。如果我们知道 Promise 是什么以及如何使用它&#xff0c;我们可以跳过这一部分并直接跳到“魔法开始”的地…

RSA加密与解密原理

目录 一、什么是RSA加密 二、RSA加密原理 三、RSA加解密过程与算法代码 一、什么是RSA加密 RSA加密是一种非对称加密算法。 对称加密&#xff1a; 对称加密是一种加密方式&#xff0c;加密和解密使用同一个密钥&#xff0c;被加密的信息在传输前用预先协商好的密钥进行加密…

KUKA机器人如何强制输出或取消数字IO信号?

KUKA机器人如何强制输出或取消数字IO信号? 具体的操作方法和步骤可参考以下内容: 如下图所示,点击菜单—显示—输入/输出端,如下图所示,选择想要查看的信号,这里以数字输出端为例进行说明, 如下图所示,此时可以看到输出端信号的编号、名称和当前值,可以通过下拉滚动条…

河北专升本(C语言)

目录 一&#xff1a;C语言的构成特点 二: 数据类型 三: 常量、变量、运算符及表达式 &#xff08;一&#xff09;标识符 &#xff08;二&#xff09;常量 &#xff08;三&#xff09;变量&#xff1a;其值可以改变的量 &#xff08;四&#xff09;各种类型数据混合运算 &…

简单好用的解压缩软件:keka 中文 for mac

Keka是一款功能全面、易于使用的文件压缩和解压缩软件&#xff0c;为Mac用户提供了便捷的文件管理工具。它支持多种压缩格式&#xff0c;具有快速解压和强大的压缩功能&#xff0c;让您能够轻松地处理各种文件压缩需求。 隐私非常重要 安全共享只需设置密码并创建高度加密的文…

深度强化学习 第 2 章 蒙特卡洛

2.1随机变量 强化学习中会经常用到两个概念&#xff1a; 随机变量、 观测值。 本书用大写字母表示随机变量&#xff0c;小写字母表示观测值&#xff0c;避免造成混淆。 下面我们定义概率质量函数&#xff08;probability mass function&#xff0c;缩写 PMF&#xff09;和概率…

LINUX定时解压缩方案

需求背景 对接客户中某个上游为外包系统&#xff0c;外包系统每日推送压缩文件至指定文件夹下&#xff0c;文件格式为YYYYMMDD_RegReport.zip。由于每日采集文件&#xff0c;无法对接压缩包内文件&#xff0c;需要将推送的压缩文件每日解压为文件夹 需求分析 与客户沟通后&a…

HarmonyOS 远端状态订阅开发实例

IPC/RPC 提供对远端 Stub 对象状态的订阅机制&#xff0c; 在远端 Stub 对象消亡时&#xff0c;可触发消亡通知告诉本地 Proxy 对象。这种状态通知订阅需要调用特定接口完成&#xff0c;当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户&#xff0c;需要实现消…

C++初阶(1)

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; ​ &#x1f354;前言&#xff1a; 今天我们正式进入C篇章&#xff0c;作为学过C语言的同志&#xff0c;继续学习C肯定就不会进行那些与C语言相同的学习&#xff0c;因为C语言的内容在C中也可以正常使用&#xff0c;所…