Web用nodejs刮擦Google Play应用程序信息
#node #webscraping #serpapi #google

将被刮擦

what

ð注意:您可以使用官方的Google Play Developer API,该200,000 requests per day retrieving the list of reviews and individual reviews的默认限制。

另外,您可以使用完整的第三方Google Play商店应用程序刮擦解决方案google-play-scraper。第三方解决方案通常用于打破配额限制。

本博客文章旨在为如何使用Cheerio刮擦Google Play商店应用程序一个想法和逐步示例。

完整代码

如果您不需要解释,请看一下the full code example in the online IDE

const cheerio = require("cheerio");
const axios = require("axios");

const AXIOS_OPTIONS = {
  headers: {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36",
  }, // adding the User-Agent header as one way to prevent the request from being blocked
  params: {
    id: "com.discord", // Parameter defines the ID of a product you want to get the results for
    hl: "en", // Parameter defines the language to use for the Google search
    gl: "us", // parameter defines the country to use for the Google search
  },
};

function getAppInfo() {
  return axios.get(`https://play.google.com/store/apps/details`, AXIOS_OPTIONS).then(function ({ data }) {
    let $ = cheerio.load(data);

    return {
      productInfo: {
        title: $(".Fd93Bb")?.text().trim(),
        authors: Array.from($(".Vbfug")).map((el) => ({
          name: $(el).find("a > span")?.text().trim(),
          link: `https://play.google.com${$(el).find("a")?.attr("href")}`,
        })),
        extensions: Array.from($(".UIuSk")).map((el) => $(el)?.text().trim().replaceAll(" · ", "")),
        rating: parseFloat($(".TT9eCd")?.text().trim()) || "No rating",
        reviews: $(".wVqUob:first-child .g1rdde")?.text().trim(),
        contentRating: {
          text: $(".wVqUob:last-child .g1rdde > span")?.text().trim(),
          thumbnail: $(".wVqUob:last-child .ClM7O > img")?.attr("srcset")?.slice(0, -3),
        },
        downloads: $(".wVqUob:nth-child(2) .ClM7O")?.text().trim(),
        thumbnail: $(".l8YSdd > img")?.attr("srcset")?.slice(0, -3),
        offers: {
          text: $(".VAgTTd button")?.attr("aria-label"),
          link: $(".VAgTTd button meta[itemprop='url']")?.attr("content"),
          price: $(".VAgTTd button meta[itemprop='price']")?.attr("content"),
        },
      },
      media: {
        video: {
          thumbnail: $(".oiEt0d")?.attr("src"),
          link: $(".IZOk1 button")?.attr("data-trailer-url"),
        },
        images: Array.from($(".ULeU3b img")).map((el) => $(el)?.attr("srcset")?.slice(0, -3)),
      },
      aboutThisApp: {
        snippet: $(".bARER")?.text().trim(),
      },
      badges: Array.from($(".Uc6QCc > div > button")).map((el) => ({
        name: $(el).find("span")?.text().trim(),
      })),
      categories: Array.from($(".Uc6QCc > div > div")).map((el) => {
        const link = `https://play.google.com${$(el).find(" a")?.attr("href")}`;
        const categoryId = link.slice(link.indexOf("category/") + 9);
        return {
          name: $(el).find("span")?.text().trim(),
          link,
          categoryId,
        };
      }),
      updatedOn: $(".TKjAsc .xg1aie")?.text().trim(),
      dataSafety: Array.from($(".wGcURe")).map((el) => {
        const subtext = $(el).find(".jECfAf")?.text().trim() || "No subtext";
        return {
          text: $(el)?.text().trim().replace(subtext, ""),
          subtext,
          link: $(el).find(".jECfAf a")?.attr("href") || "No link",
        };
      }),
      whatsNew: {
        snippet: $("c-wiz[jsrenderer='q8s33d'] .SfzRHd")?.text().trim(),
      },
      reviews: Array.from($(".EGFGHd")).map((el) => ({
        title: $(el).find(".X5PpBb")?.text().trim(),
        avatar: $(el).find(".gSGphe > img")?.attr("srcset")?.slice(0, -3),
        rating: parseInt($(el).find(".Jx4nYe > div")?.attr("aria-label")?.slice(6)),
        snippet: $(el).find(".h3YV2d")?.text().trim(),
        likes: parseInt($(el).find(".AJTPZc")?.text().trim()),
        date: $(el).find(".bp9Aid")?.text().trim(),
        response: $(el).find(".ocpBU .I6j64d")?.text().trim()
          ? {
              title: $(el).find(".ocpBU .I6j64d")?.text().trim(),
              snippet: $(el).find(".ocpBU .ras4vb")?.text().trim(),
              date: $(el).find(".ocpBU .I9Jtec")?.text().trim(),
            }
          : "No response",
      })),
      developerContact: {
        website: $("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ:nth-child(1) .Si6A0c")?.attr("href"),
        email: $("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ:nth-child(2) .Si6A0c")?.attr("href").replace("mailto:", ""),
        address: $(Array.from($("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ .xFVDSb")).find((el) => $(el)?.text().trim() === "Address"))
          .parent()
          .find(".pSEeg")
          ?.text()
          .trim(),
        privacyPolicy: $("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ:last-child .Si6A0c")?.attr("href"),
      },
      similarApps: Array.from($("c-wiz[jsrenderer='G2gJT'] .HcyOxe")).map((block) => ({
        categoryTitle: $(block).find(".cswwxf h2")?.text().trim(),
        seeMoreLink: `https://play.google.com${$(block).find(".cswwxf a")?.attr("href")}`,
        items: Array.from($(block).find(".fUtUMc")).map((app) => {
          const link = `https://play.google.com${$(app).find(".Si6A0c")?.attr("href")}`;
          const appId = link.slice(link.indexOf("?id=") + 4);
          return {
            title: $(app).find(".DdYX5")?.text().trim(),
            link,
            developer: $(app).find(".wMUdtb")?.text().trim(),
            rating: parseFloat($(app).find(".w2kbF")?.text().trim()) || "No rating",
            thumbnail: $(app).find(".T75of")?.attr("srcset")?.slice(0, -3),
            appId,
          };
        }),
      })),
    };
  });
}

getAppInfo().then((result) => console.dir(result, { depth: null }));

准备

首先,我们需要创建一个node.js* project,然后添加koude0套件koude1koude1koude2koude2添加到网站上。

为此,在我们项目的目录中,打开命令行并输入:

$ npm init -y

,然后:

$ npm i cheerio axios

*如果您没有安装node.js,则可以download it from nodejs.org并遵循安装documentation

Process

首先,我们需要从HTML元素中提取数据。通过SelectorGadget Chrome extension,获得合适的CSS选择器的过程非常容易,该过程能够通过单击浏览器中的所需元素来获取CSS选择器。但是,它并不总是完美地工作,尤其是当JavaScript大量使用该网站时。

如果您想了解更多有关它们的信息,我们在Serpapi上有专门的web Scraping with CSS Selectors博客文章。

下面的GIF说明了选择结果不同部分的方法。

how

代码说明

koude1koude2库中声明常数:

const cheerio = require("cheerio");
const axios = require("axios");

接下来,我们编写一个请求选项:koude6koude5(用于用作“真实”用户访问。Default koude2 request user-agent is koude8,因此网站了解这是一个发送请求并可能阻止它的脚本。Check what's your user-agent),以及必要的提出请求的参数:

const AXIOS_OPTIONS = {
  headers: {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36",
  }, // adding the User-Agent header as one way to prevent the request from being blocked
  params: {
    id: "com.discord", // Parameter defines the ID of a product you want to get the results for
    hl: "en", // Parameter defines the language to use for the Google search
    gl: "us", // parameter defines the country to use for the Google search
  },
};

接下来,我们编写一个函数,该函数使请求并返回接收到的数据。我们收到了koude2请求的响应,该请求具有我们的destructureddata键,并用koude1进行解析:

function getAppInfo() {
  return axios.get(`https://play.google.com/store/apps/details`, AXIOS_OPTIONS).then(function ({ data }) {
    let $ = cheerio.load(data);
    ...
  })
}

接下来,我们需要使用下一个方法获取页面的不同部分:

首先,我们获得了主要产品信息:

productInfo: {
  title: $(".Fd93Bb")?.text().trim(),
  authors: Array.from($(".Vbfug")).map((el) => ({
    name: $(el).find("a > span")?.text().trim(),
    link: `https://play.google.com${$(el).find("a")?.attr("href")}`,
  })),
  extensions: Array.from($(".UIuSk")).map((el) => $(el)?.text().trim().replaceAll(" · ", "")),
  rating: parseFloat($(".TT9eCd")?.text().trim()) || "No rating",
  reviews: $(".wVqUob:first-child .g1rdde")?.text().trim(),
  contentRating: {
    text: $(".wVqUob:last-child .g1rdde > span")?.text().trim(),
    thumbnail: $(".wVqUob:last-child .ClM7O > img")?.attr("srcset")?.slice(0, -3),
  },
  downloads: $(".wVqUob:nth-child(2) .ClM7O")?.text().trim(),
  thumbnail: $(".l8YSdd > img")?.attr("srcset")?.slice(0, -3),
  offers: {
    text: $(".VAgTTd button")?.attr("aria-label"),
    link: $(".VAgTTd button meta[itemprop='url']")?.attr("content"),
    price: $(".VAgTTd button meta[itemprop='price']")?.attr("content"),
  },
},

接下来,我们将获得视频,图像和描述信息:

media: {
  video: {
    thumbnail: $(".oiEt0d")?.attr("src"),
    link: $(".IZOk1 button")?.attr("data-trailer-url"),
  },
  images: Array.from($(".ULeU3b img")).map((el) => $(el)?.attr("srcset")?.slice(0, -3)),
},
aboutThisApp: {
  snippet: $(".bARER")?.text().trim(),
},

接下来,BAGES类别信息:

badges: Array.from($(".Uc6QCc > div > button")).map((el) => ({
  name: $(el).find("span")?.text().trim(),
})),
categories: Array.from($(".Uc6QCc > div > div")).map((el) => {
  const link = `https://play.google.com${$(el).find(" a")?.attr("href")}`;
  const categoryId = link.slice(link.indexOf("category/") + 9);
  return {
    name: $(el).find("span")?.text().trim(),
    link,
    categoryId,
  };
}),

接下来,我们在更新应用程序时获得了新的以及数据安全信息:

updatedOn: $(".TKjAsc .xg1aie")?.text().trim(),
dataSafety: Array.from($(".wGcURe")).map((el) => {
  const subtext = $(el).find(".jECfAf")?.text().trim() || "No subtext";
  return {
    text: $(el)?.text().trim().replace(subtext, ""),
    subtext,
    link: $(el).find(".jECfAf a")?.attr("href") || "No link",
  };
}),
whatsNew: {
  snippet: $("c-wiz[jsrenderer='q8s33d'] .SfzRHd")?.text().trim(),
},

接下来,用户评论:

reviews: Array.from($(".EGFGHd")).map((el) => ({
  title: $(el).find(".X5PpBb")?.text().trim(),
  avatar: $(el).find(".gSGphe > img")?.attr("srcset")?.slice(0, -3),
  rating: parseInt($(el).find(".Jx4nYe > div")?.attr("aria-label")?.slice(6)),
  snippet: $(el).find(".h3YV2d")?.text().trim(),
  likes: parseInt($(el).find(".AJTPZc")?.text().trim()),
  date: $(el).find(".bp9Aid")?.text().trim(),
  response: $(el).find(".ocpBU .I6j64d")?.text().trim()
    ? {
        title: $(el).find(".ocpBU .I6j64d")?.text().trim(),
        snippet: $(el).find(".ocpBU .ras4vb")?.text().trim(),
        date: $(el).find(".ocpBU .I9Jtec")?.text().trim(),
      }
    : "No response",
})),

接下来,开发人员联系人:

developerContact: {
  website: $("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ:nth-child(1) .Si6A0c")?.attr("href"),
  email: $("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ:nth-child(2) .Si6A0c")?.attr("href").replace("mailto:", ""),
  address: $(Array.from($("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ .xFVDSb")).find((el) => $(el)?.text().trim() === "Address"))
    .parent()
    .find(".pSEeg")
    ?.text()
    .trim(),
  privacyPolicy: $("c-wiz[jsrenderer='Grlxwe'] .SfzRHd .KC1dQ:last-child .Si6A0c")?.attr("href"),
},

最后,类似的应用程序:

similarApps: Array.from($("c-wiz[jsrenderer='G2gJT'] .HcyOxe")).map((block) => ({
  categoryTitle: $(block).find(".cswwxf h2")?.text().trim(),
  seeMoreLink: `https://play.google.com${$(block).find(".cswwxf a")?.attr("href")}`,
  items: Array.from($(block).find(".fUtUMc")).map((app) => {
    const link = `https://play.google.com${$(app).find(".Si6A0c")?.attr("href")}`;
    const appId = link.slice(link.indexOf("?id=") + 4);
    return {
      title: $(app).find(".DdYX5")?.text().trim(),
      link,
      developer: $(app).find(".wMUdtb")?.text().trim(),
      rating: parseFloat($(app).find(".w2kbF")?.text().trim()) || "No rating",
      thumbnail: $(app).find(".T75of")?.attr("srcset")?.slice(0, -3),
      appId,
    };
  }),
})),

现在我们可以启动我们的解析器:

$ node YOUR_FILE_NAME # YOUR_FILE_NAME is the name of your .js file

输出

{
   "productInfo":{
      "title":"Discord: Talk, Chat & Hang Out",
      "authors":[
         {
            "name":"Discord Inc.",
            "link":"https://play.google.com/store/apps/developer?id=Discord+Inc."
         }
      ],
      "extensions":[
         "In-app purchases"
      ],
      "rating":4.1,
      "reviews":"4.76M reviews",
      "contentRating":{
         "text":"Teen",
         "thumbnail":"https://play-lh.googleusercontent.com/mw_NfsvKM8m6RPv8Fz2GQawCOsqWv010saMnc7zbWalMxuaA9IY8h7E0VMieLxSxAFB98NFeYqbFrXXq=w96-h32-rw"
      },
      "downloads":"100M+",
      "thumbnail":"https://play-lh.googleusercontent.com/0oO5sAneb9lJP6l8c6DH4aj6f85qNpplQVHmPmbbBxAukDnlO7DarDW0b-kEIHa8SQ=s96-rw",
      "offers":{
         "text":"Install",
         "link":"https://play.google.com/store/apps/details?id=com.discord&rdid=com.discord&feature=md&offerId",
         "price":"0"
      }
   },
   "media":{
      "video":{
         "thumbnail":"https://i.ytimg.com/vi/XoCvEM0Ah6E/hqdefault.jpg",
         "link":"https://play.google.com/video/lava/web/player/yt:movie:XoCvEM0Ah6E?autoplay=1&embed=play"
      },
      "images":[
         "https://play-lh.googleusercontent.com/85W8SSlu7z62P5uqatGOxdhX8JJJ7c_p11I_982xaPxMptsE9z4QeZr78Ua_E7A8OQ=w1052-h592-rw",
         ...and other images
      ]
   },
   "aboutThisApp":{
      "snippet":"Discord is where you can make a home for your communities and friends. Where you can stay close and have fun over text, voice, and video chat. Whether you’re part of a school club, a gaming group, a worldwide art community, or just a handful of friends who want to spend time together, Discord makes it easy to talk every day, and hang out more often.CREATE AN INVITE-ONLY PLACE•  Discord servers are organized into topic-based channels where you can collaborate, share, have meetings, or just talk to friends about your day without clogging up a group chat.•  Send a message directly to a friend or call them up with our voice chat feature•  Voice channels make hanging out easy. Got a free moment? Grab a seat in a voice channel so friends can see you’re around and pop in to talk without having to call. You can even watch videos together!•  Reliable tech for staying close with friends. Low-latency voice and video chat feels like you’re meeting in the same room.•  Easily talk with friends while gaming and steam roll the competition.•  Be a meme messenger with easy image sharing STAY CLOSE WITH TEXT, VIDEO, AND VOICE CHAT•  Wave hello over video, watch friends stream their games, share stories over voice calls, or gather up and have a drawing session with screen share.•  Snap a photo and turn it into your own custom emojis and share them with friends.•  Share anything from funny videos and stories to your latest group photos, and pin your favorites to remember those moments later.•  Hang out in group channels or talk privately with direct messages•  Zoom through convos with friends using topic-specific channels! FOR A FEW OR A FANDOM•  Custom moderation tools and permission levels can group up your friends or teams, organize meetings for your local book club, or bring together music fans from around the world.•  Create moderators, give special members access to private channels, and much more."
   },
   "badges":[
      {
         "name":"#1 top grossing communication"
      }
   ],
   "categories":[
      {
         "name":"Communication",
         "link":"https://play.google.com/store/apps/category/COMMUNICATION",
         "categoryId":"COMMUNICATION"
      }
   ],
   "updatedOn":"Oct 17, 2022",
   "dataSafety":[
      {
         "text":"This app may share these data types with third parties",
         "subtext":"Device or other IDs",
         "link":"No link"
      },
      ...and other data safety info
   ],
   "whatsNew":{
      "snippet":"As always, we have made some bug fixes and improvements.Please checkout our in-app changelog via Settings -> \"Change Log\" for more detailed informationOr check out our Twitter: https://twitter.com/discord"
   },
   "reviews":[
      {
         "title":"Elphaba Fang (Nesissa)",
         "avatar":"https://play-lh.googleusercontent.com/a-/ACNPEu-7nG2DMYHSehZX_CHW53PNzz8us_3P39oZJ4iT3g=s64-rw",
         "rating":2,
         "snippet":"So, used to play D&D through discord, but after some of the more recent updates it's made it impossible to type up any encounters because the text won't scroll with the cursor and whatnot. Tried contacting the support team, and did everything they suggested. Nothing fixed. I loved this app, and if it wasn't the only way to keep in contact with so many of my friends I wouldn't use it as often.",
         "likes":30,
         "date":"October 18, 2022",
         "response":{
            "title":"Discord Inc.",
            "snippet":"We hear you, and our teams are actively working on rolling out fixes daily. If you continue to experience issues, please make sure your app is on the latest updated version and follow-up with our support. Additionally, your feedback greatly affects what we focus on, so please let us know if you continue to have issues at dis.gd/contact.",
            "date":"October 18, 2022"
         }
      },
      ...and other reviews
   ],
   "developerContact":{
      "website":"https://dis.gd/contact",
      "email":"support@discord.com",
      "address":"444 De Haro St #200, San Francisco, CA 94107, USA",
      "privacyPolicy":"https://discordapp.com/privacy/"
   },
   "similarApps":[
      {
         "categoryTitle":"Similar apps",
         "seeMoreLink":"https://play.google.com/store/apps/collection/cluster?gsr=SjBqGHA0U0N3U09xaTIyc29MNysvNk5RVkE9PcICEwoPCgtjb20uZGlzY29yZBAHGAg%3D:S:ANO1ljLD_aU",
         "items":[
            {
               "title":"Twitch: Live Game Streaming",
               "link":"https://play.google.com/store/apps/details?id=tv.twitch.android.app",
               "developer":"Twitch Interactive, Inc.",
               "rating":4.4,
               "thumbnail":"https://play-lh.googleusercontent.com/QLQzL-MXtxKEDlbhrQCDw-REiDsA9glUH4m16syfar_KVLRXlzOhN7tmAceiPerv4Jg=s128-rw",
               "appId":"tv.twitch.android.app"
            },
            ...and other apps
         ]
      }
   ]
}

usuingaoqian3from serpapi

本节是为了显示DIY解决方案与我们的解决方案之间的比较。

最大的区别是您不需要从头开始创建解析器并维护它。

也有可能在Google的某个时候阻止请求,我们在后端处理它,因此无需弄清楚如何自己做或弄清楚要使用哪个验证码,代理提供商。

首先,我们需要安装koude21

npm i google-search-results-nodejs

这是full code example,如果您不需要解释:

const SerpApi = require("google-search-results-nodejs");
const search = new SerpApi.GoogleSearch(process.env.API_KEY); //your API key from serpapi.com

const params = {
  engine: "google_play_product", // search engine
  gl: "us", // parameter defines the country to use for the Google search
  hl: "en", // parameter defines the language to use for the Google search
  store: "apps", // parameter defines the type of Google Play store
  product_id: "com.discord", // Parameter defines the ID of a product you want to get the results for.
};

const getJson = () => {
  return new Promise((resolve) => {
    search.json(params, resolve);
  });
};

const getResults = async () => {
  const json = await getJson();
  const {
    product_info,
    media,
    about_this_app,
    badges,
    categories,
    updated_on,
    data_safety,
    what_s_new,
    reviews,
    developer_contact,
    similar_results,
  } = json;
  return {
    product_info,
    media,
    about_this_app,
    badges,
    categories,
    updated_on,
    data_safety,
    what_s_new,
    reviews,
    developer_contact,
    similar_results,
  };
};

getResults().then((result) => console.dir(result, { depth: null }));

代码说明

首先,我们需要从koude21库中声明SerpApi,并使用SerpApi的API键定义新的search实例:

const SerpApi = require("google-search-results-nodejs");
const search = new SerpApi.GoogleSearch(API_KEY);

接下来,我们为提出请求的必要参数编写:

const params = {
  engine: "google_play_product", // search engine
  gl: "us", // parameter defines the country to use for the Google search
  hl: "en", // parameter defines the language to use for the Google search
  store: "apps", // parameter defines the type of Google Play store
  product_id: "com.discord", // Parameter defines the ID of a product you want to get the results for.
};

接下来,我们从Serpapi库中包装搜索方法,以便进一步处理搜索结果:

const getJson = () => {
  return new Promise((resolve) => {
    search.json(params, resolve);
  });
};

最后,我们声明了从页面获取数据并返回的函数getResult

const getResults = async () => {
  ...
};

在此功能中,我们获得了带有结果的json,然后我们需要destructure,然后从接收到的json中返回我们所需的一切:

const json = await getJson();
const { product_info, media, about_this_app, badges, categories, updated_on, data_safety, what_s_new, reviews, developer_contact, similar_results } =
  json;
return {
  product_info,
  media,
  about_this_app,
  badges,
  categories,
  updated_on,
  data_safety,
  what_s_new,
  reviews,
  developer_contact,
  similar_results,
};

之后,我们运行getResults函数并使用koude29方法在控制台中打印所有接收的信息,该方法允许您使用带有必要参数的对象来更改默认输出选项:

getResults().then((result) => console.dir(result, { depth: null }));

输出

{
   "product_info":{
      "title":"Discord: Talk, Chat & Hang Out",
      "authors":[
         {
            "name":"Discord Inc.",
            "link":"https://play.google.com/store/apps/developer?id=Discord+Inc."
         }
      ],
      "extensions":[
         "In-app purchases"
      ],
      "rating":4.1,
      "reviews":4760000,
      "content_rating":{
         "text":"Teen",
         "thumbnail":"https://play-lh.googleusercontent.com/mw_NfsvKM8m6RPv8Fz2GQawCOsqWv010saMnc7zbWalMxuaA9IY8h7E0VMieLxSxAFB98NFeYqbFrXXq=w48-h16-rw"
      },
      "downloads":"100M+",
      "thumbnail":"https://play-lh.googleusercontent.com/0oO5sAneb9lJP6l8c6DH4aj6f85qNpplQVHmPmbbBxAukDnlO7DarDW0b-kEIHa8SQ=w240-h480-rw",
      "offers":[
         {
            "text":"Install",
            "link":"https://play.google.com/store/apps/details?id=com.discord&rdid=com.discord&feature=md&offerId"
         }
      ]
   },
   "media":{
      "video":{
         "thumbnail":"https://i.ytimg.com/vi/XoCvEM0Ah6E/hqdefault.jpg",
         "link":"https://play.google.com/video/lava/web/player/yt:movie:XoCvEM0Ah6E?autoplay=1&embed=play"
      },
      "images":[
         "https://play-lh.googleusercontent.com/85W8SSlu7z62P5uqatGOxdhX8JJJ7c_p11I_982xaPxMptsE9z4QeZr78Ua_E7A8OQ=w526-h296-rw",
         ...and other images
      ]
   },
   "about_this_app":{
      "snippet":"Discord is where you can make a home for your communities and friends. Where you can stay close and have fun over text, voice, and video chat. Whether you’re part of a school club, a gaming group, a worldwide art community, or just a handful of friends who want to spend time together, Discord makes it easy to talk every day, and hang out more often.CREATE AN INVITE-ONLY PLACE• Discord servers are organized into topic-based channels where you can collaborate, share, have meetings, or just talk to friends about your day without clogging up a group chat.• Send a message directly to a friend or call them up with our voice chat feature• Voice channels make hanging out easy. Got a free moment? Grab a seat in a voice channel so friends can see you’re around and pop in to talk without having to call. You can even watch videos together!• Reliable tech for staying close with friends. Low-latency voice and video chat feels like you’re meeting in the same room.• Easily talk with friends while gaming and steam roll the competition.• Be a meme messenger with easy image sharing STAY CLOSE WITH TEXT, VIDEO, AND VOICE CHAT• Wave hello over video, watch friends stream their games, share stories over voice calls, or gather up and have a drawing session with screen share.• Snap a photo and turn it into your own custom emojis and share them with friends.• Share anything from funny videos and stories to your latest group photos, and pin your favorites to remember those moments later.• Hang out in group channels or talk privately with direct messages• Zoom through convos with friends using topic-specific channels! FOR A FEW OR A FANDOM• Custom moderation tools and permission levels can group up your friends or teams, organize meetings for your local book club, or bring together music fans from around the world.• Create moderators, give special members access to private channels, and much more."
   },
   "badges":[
      {
         "name":"#1 top grossing communication"
      }
   ],
   "categories":[
      {
         "name":"Communication",
         "link":"https://play.google.com/store/apps/category/COMMUNICATION",
         "category_id":"COMMUNICATION",
         "serpapi_link":"https://serpapi.com/search.json?apps_category=COMMUNICATION&engine=google_play&gl=us&hl=en&store=apps"
      }
   ],
   "updated_on":"Oct 17, 2022",
   "data_safety":[
      {
         "text":"This app may share these data types with third parties",
         "subtext":"Device or other IDs"
      },
      ...and other data safety info
   ],
   "what_s_new":{
      "snippet":"As always, we have made some bug fixes and improvements.Please checkout our in-app changelog via Settings -> \"Change Log\" for more detailed informationOr check out our Twitter: https://twitter.com/discord"
   },
   "reviews":[
      {
         "title":"Elphaba Fang (Nesissa)",
         "avatar":"https://play-lh.googleusercontent.com/a-/ACNPEu-7nG2DMYHSehZX_CHW53PNzz8us_3P39oZJ4iT3g",
         "rating":2,
         "snippet":"So, used to play D&D through discord, but after some of the more recent updates it's made it impossible to type up any encounters because the text won't scroll with the cursor and whatnot. Tried contacting the support team, and did everything they suggested. Nothing fixed. I loved this app, and if it wasn't the only way to keep in contact with so many of my friends I wouldn't use it as often.",
         "likes":34,
         "date":"October 18, 2022",
         "response":{
            "title":"Discord Inc.",
            "snippet":"We hear you, and our teams are actively working on rolling out fixes daily. If you continue to experience issues, please make sure your app is on the latest updated version and follow-up with our support. Additionally, your feedback greatly affects what we focus on, so please let us know if you continue to have issues at dis.gd/contact.",
            "date":"October 18, 2022"
         }
      },
      ...and other reviews
   ],
   "developer_contact":{
      "website":"https://dis.gd/contact",
      "email":"support@discord.com",
      "address":"444 De Haro St #200, San Francisco, CA 94107, USA",
      "privacy_policy":"https://discordapp.com/privacy/"
   },
   "similar_results":[
      {
         "title":"Similar apps",
         "see_more_link":"https://play.google.com/store/apps/collection/cluster?gsr=SjBqGEd2MDZGRy8yYkg5Y2JxOTY1NTlFSGc9PcICEwoPCgtjb20uZGlzY29yZBAHGAg%3D:S:ANO1ljIP9ug",
         "see_more_token":"SjBqGEd2MDZGRy8yYkg5Y2JxOTY1NTlFSGc9PcICEwoPCgtjb20uZGlzY29yZBAHGAg%3D:S:ANO1ljIP9ug",
         "serpapi_link":"https://serpapi.com/search.json?engine=google_play&gl=us&hl=en&see_more_token=SjBqGEd2MDZGRy8yYkg5Y2JxOTY1NTlFSGc9PcICEwoPCgtjb20uZGlzY29yZBAHGAg%253D%3AS%3AANO1ljIP9ug&store=apps",
         "items":[
            {
               "title":"Twitch: Live Game Streaming",
               "link":"https://play.google.com/store/apps/details?id=tv.twitch.android.app",
               "product_id":"tv.twitch.android.app",
               "serpapi_link":"https://serpapi.com/search.json?engine=google_play_product&gl=us&hl=en&product_id=tv.twitch.android.app&store=apps",
               "rating":4.4,
               "extension":[
                  "Twitch Interactive, Inc."
               ],
               "thumbnail":"https://play-lh.googleusercontent.com/QLQzL-MXtxKEDlbhrQCDw-REiDsA9glUH4m16syfar_KVLRXlzOhN7tmAceiPerv4Jg=s64-rw"
            },
            ...and other apps
         ]
      }
   ]
}

链接

如果您想查看一些用Serpapi制造的项目,write me a message


加入我们的Twitter | YouTube

添加一个Feature Requestð«或Bugð