Как соскрести Knowledge Graph из Google Search с помощью Node.js


Что будет соскоблено

📌Примечание: граф знаний имеет различные макеты, поэтому код, который я предоставляю, работает с этим макетом, как показано на скриншоте.

Подготовка

Сначала нам нужно создать проект Node.js* и добавить пакеты npm cheerio для разбора частей HTML-разметки и axios для выполнения запроса к веб-сайту. Для этого в директории с нашим проектом откройте командную строку и введите npm init -y, а затем npm i cheerio axios.

*Если у вас не установлен Node.js, вы можете скачать его с сайта nodejs.org и следовать документации по установке.

Процесс

Расширение SelectorGadget Chrome использовалось для захвата селекторов CSS при нажатии на нужный элемент в браузере. Если у вас возникли трудности с пониманием этого, у нас есть специальная статья в блоге SerpApi, посвященная веб-скрапингу с CSS-селекторами.
Приведенный ниже рисунок иллюстрирует подход к выбору различных частей результатов.

Полный код

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

const searchString = "tesla";                                    // what we want to search
    const encodedString = encodeURI(searchString);              // what we want to search for in URI encoding

const domain = `http://google.com`;                             // google domain of the search

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: {
    q: encodedString,                                           // our encoded search string
    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 getKnowledgeGraphInfo() {
  return axios.get(`${domain}/search`, AXIOS_OPTIONS).then(function ({ data }) {
    let $ = cheerio.load(data);

    const pattern = /s='(?<img>[^']+)';w+sw+=['(?<id>w+_d+)'];/gm;      // https://regex101.com/r/pMd0yx/1
    const images = [...data.matchAll(pattern)].map(({ groups }) => ({ id: groups.id, img: groups.img.replace(/\x3d/gi, "") }));

    const allInfo = {
      title: $(".I6TXqe .qrShPb span").text().trim(),
      type: $(".I6TXqe .wwUB2c span").text().trim(),
      image: images.find(({ id }) => id === $(".I6TXqe .FZylgf img").attr("id"))?.img,
      website: $(".I6TXqe .B1uW2d").attr("href"),
      description: {
        text: $(".LWkfKe+ span").text().trim(),
        source: $(".NJLBac").text().trim(),
        link: $(".NJLBac").attr("href"),
      },
      main: Array.from($(".I6TXqe .wDYxhc .Z1hOCe")).reduce((acc, el) => {
        const key = $(el).find(".w8qArf a").text().trim();
        return { ...acc, [key]: $(el).find(".kno-fv").text() };
      }, {}),
      profiles: Array.from($(".I6TXqe .OOijTb .fl")).reduce((acc, el) => {
        const key = $(el).find(".CtCigf").text().trim();
        return { ...acc, [key]: $(el).find("a").attr("href") };
      }, {}),
      peopleAlsoSearchFor: Array.from($(".I6TXqe .VLkRKc").closest(".UDZeY").find(".Wr0c6d")).reduce((acc, el) => {
        const key = $(el).text().trim();
        return { ...acc, [key]: domain + $(el).attr("href") };
      }, {}),
    };

    return allInfo;
  });
}

getKnowledgeGraphInfo().then(console.log);
Вход в полноэкранный режим Выйти из полноэкранного режима

Объяснение кода

Объявите константы из необходимых библиотек:

const cheerio = require("cheerio");
const axios = require("axios");
Войти в полноэкранный режим Выйти из полноэкранного режима
Код Пояснение
cheerio библиотека для разбора html-страницы и доступа к необходимым селекторам
axios библиотека для запроса нужного html-документа

Далее мы пишем в константах, что мы хотим искать и кодируем наш текст в строку URI:

const searchString = "tesla";
const encodedString = encodeURI(searchString);
Вход в полноэкранный режим Выйти из полноэкранного режима
Код Пояснение
searchString что мы хотим искать
encodedString что мы хотим искать в кодировке URI

Далее записываем необходимые параметры для выполнения запроса:

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",
  },
  params: {
    q: encodedString,
    hl: "en",
    gl: "us",
  },
};
Войти в полноэкранный режим Выйти из полноэкранного режима
Код Объяснение
headers HTTP-заголовки позволяют клиенту и серверу передавать дополнительную информацию вместе с HTTP-запросом или ответом.
User-Agent используется для выполнения роли «реального» пользовательского агента. По умолчанию пользовательский агент запросов axios — axios/0.27.2, поэтому сайты понимают, что запрос посылает скрипт, и могут его заблокировать. Проверьте, какой у вас user-agent.
q кодировка в поисковом запросе URI
hl параметр определяет язык, который будет использоваться для поиска Google
gl параметр определяет страну, которую следует использовать для поиска Google.

И, наконец, функция для получения необходимой информации:

function getKnowledgeGraphInfo() {
  return axios.get(`${domain}/search`, AXIOS_OPTIONS).then(function ({ data }) {
    let $ = cheerio.load(data);

    const pattern = /s='(?<img>[^']+)';w+sw+=['(?<id>w+_d+)'];/gm;
    const images = [...data.matchAll(pattern)].map(({ groups }) => ({ id: groups.id, img: groups.img.replace(/\x3d/gi, "") }));

    const allInfo = {
      title: $(".I6TXqe .qrShPb span").text().trim(),
      type: $(".I6TXqe .wwUB2c span").text().trim(),
      image: images.find(({ id }) => id === $(".I6TXqe .FZylgf img")?.attr("id")).img,
      website: $(".I6TXqe .B1uW2d").attr("href"),
      description: {
        text: $(".LWkfKe+ span").text().trim(),
        source: $(".NJLBac").text().trim(),
        link: $(".NJLBac").attr("href"),
      },
      main: Array.from($(".I6TXqe .wDYxhc .Z1hOCe")).reduce((acc, el) => {
        const key = $(el).find(".w8qArf a").text().trim();
        return { ...acc, [key]: $(el).find(".kno-fv").text() };
      }, {}),
      profiles: Array.from($(".I6TXqe .OOijTb .fl")).reduce((acc, el) => {
        const key = $(el).find(".CtCigf").text().trim();
        return { ...acc, [key]: $(el).find("a").attr("href") };
      }, {}),
      peopleAlsoSearchFor: Array.from($(".I6TXqe .VLkRKc").closest(".UDZeY").find(".Wr0c6d")).reduce((acc, el) => {
        const key = $(el).text().trim();
        return { ...acc, [key]: domain + $(el).attr("href") };
      }, {}),
    };

    return allInfo;
  });
}
Вход в полноэкранный режим Выход из полноэкранного режима
Код Объяснение
function ({ data }) мы получили ответ от запроса axios, в котором есть ключ data, который мы деструктурировали (эта запись равна function (response) и в следующей строке cheerio.load(response.data))
pattern шаблон RegEx для поиска и определения полных изображений. Посмотрите, что он позволяет найти
images массив, содержащий id селектора img и само изображение
[...data.matchAll(pattern)] в этом коде мы используем синтаксис spread для создания массива из итератора, который был возвращен из метода matchAll (в данном случае эта запись равна Array.from(data.matchAll(pattern)))
.replace('\x3d', '') в этом коде мы удаляем x3d символы из конца строки формата изображения base64 для правильного отображения изображения
allInfo объект с полной информацией из графа знаний
{ id }
.attr('href') получает значение атрибута href элемента html
$(el).find('.kno-fv') находит элемент с именем класса kno-fv во всех дочерних элементах и их дочерних элементах html-элемента el
$(".I6TXqe .VLkRKc").closest(".UDZeY") находит ближайший родительский элемент с именем класса UDZeY в элементах с именем класса I6TXqe, которые имеют элементы с именами классов VLkRKc
.text() получает необработанный текст элемента html
.trim() удаляет пробельные символы с обоих концов строки
{...acc, [key]: $(el).find(".kno-fv").text()} в этом коде мы используем синтаксис spread для создания объекта из результата, который был возвращен из предыдущего вызова reduce, и добавляем в этот объект новый элемент с ключом key и значением из html-элемента.

Теперь мы можем запустить наш парсер. Для этого введите node YOUR_FILE_NAME в командную строку. Где YOUR_FILE_NAME — это имя вашего файла .js.

Вывод

{
  "title": "Tesla, Inc.",
  "type": "Automotive company",
  "image": "data:image/png;base64,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",
  "website": "http://www.tesla.com/",
  "description": {
    "text": "Tesla, Inc. is an American automotive and clean energy company based in Austin, Texas. Tesla designs and manufactures electric vehicles, battery energy storage from home to grid-scale, solar panels and solar roof tiles, and related products and services.",
    "source": "Wikipedia",
    "link": "https://en.wikipedia.org/wiki/Tesla,_Inc."
  },
  "main": {
    "Customer service chat": "Online Chat",
    "Stock price": "TSLA (NASDAQ) $663.90 -45.52 (-6.42%)May 20, 4:00 PM EDT - Disclaimer",
    "Customer service": "1 (888) 518-3752",
    "Sales": "1 (650) 681-5100",
    "Founded": "July 1, 2003, San Carlos, CA",
    "Headquarters": "Austin, TX",
    "Founders": "Elon Musk, Martin Eberhard, JB Straubel, Marc Tarpenning, Ian Wright"
  },
  "profiles": {
    "Twitter": "https://twitter.com/Tesla",
    "Instagram": "https://www.instagram.com/teslamotors",
    "LinkedIn": "https://www.linkedin.com/company/tesla-motors",
    "YouTube": "https://www.youtube.com/user/TeslaMotors",
    "Facebook": "https://www.facebook.com/electriceverywhere/"
  },
  "peopleAlsoSearchFor": {
    "Rivian": "http://google.com/search?hl=en&gl=us&q=Rivian&si=AC1wQDBgv4q3A2ojf086TvVgL6tTfKEZW2vrlR3V2uQ-r4wcbsReC3ET6H2gzOSJ83emah_DqBM87DBklcE_mqoTL6cnz4FB1PMxbYfHDHyZdLCyx8zARIwys088KWe7WiklQlXZK_a7dUf-yHR9rfskLPg5guGpehAFTM3fd3hWpBPW5dczKTfsYPqr14le6A9ntskIhEz3TcTFs-NfV-pYomsgg4TqTCwEZ2q78gSuQ2k7lCmM2RK7N6D_QrOJII8refqi1sQCnF5fSz2dpVnhex28ek6DZBQAIBWnfpqfBT0TR8mmzQY%3D&sa=X&ved=2ahUKEwi24_rLyfX3AhVVK80KHf-fDDoQxA16BAhiEAU",
    "Porsche": "http://google.com/search?hl=en&gl=us&q=Porsche&si=AC1wQDCwN61-ebmuwbQCO5QCrgOvEq5bkWeIzJ5JczItzAKNdRDXvnuw4L4VhlFx9HJV6OqmqtHAqzPbjVJQTwLot5VNg5xzaaCA4jSgbzJaVgihv2J3-LIDNlX1WqL91VSm_FeZk82jX-bHWYKn10Fi0s1BJzHTawI0qAtv96gwjDkx7V_htiR2kxFVzA7AQ4cQCw3CJ6Ip1UkJtRCk5CfuKq3PhLki8BfCXnAWXVPJ7q8ySkdC74wGOae908caHajpT8We8-UmIUtPdHFJCOecopicrNqwbDKyCtQFvP-2Q5CY5uyu2DA%3D&sa=X&ved=2ahUKEwi24_rLyfX3AhVVK80KHf-fDDoQxA16BAhiEAc",
    "NIO": "http://google.com/search?hl=en&gl=us&q=NIO&si=AC1wQDAXKblb4YtxZaDquKpQ5Js55CVph8NS1FIwBhgs6qyyHkehlU67aH1NSQuNhCW8DVAYZPw0DpddMm6wTKTN_Bvaze-B5FZFuI7smOYC3exZRBqB1hk0qKg9Kiv1fQ59L8TBbBAU8OOK0XFI4nAnmzy7G1NxHWMC_rq2hInqckB6GzyuGbsYEFixmX3yYpjCk9nUgVi_bvFQ-uWAdGaEZEaX-TpmPVtqjgcckC13fXyJMz-b8twpo4MntcWGbO06ceNB2YD9IvnaliU-XIfwHtOZc2pEhvax5L1V4cNA2sXlCyiTCx0%3D&sa=X&ved=2ahUKEwi24_rLyfX3AhVVK80KHf-fDDoQxA16BAhiEAk",
    "Sunrun": "http://google.com/search?hl=en&gl=us&q=Sunrun&si=AC1wQDBgv4q3A2ojf086TvVgL6tTfKEZW2vrlR3V2uQ-r4wcbmSu5nhquKqWlG2lGADH9r4kgGmXn4Lx085H40Gw8Qkq5MAMrE_2zOdeGSFnxbNwaYps0-scCzFFuAgxHXGMOmaKcxEYHFbpyU29GQaUYPgTlYfFkN9MHAcmUOFQVoDAAuPOSgbHN3qoHZP7jZiqoHw74zfkgeYScjelV-aWW1jx8mBj4pStMhjKSwEoLlri5O63Di9LXMX9LIAasThnFWea1p-jMKTqh4GUWrQXSjXOMFRGAgS_uBO7Fkfe0-vXKOx77A0%3D&sa=X&ved=2ahUKEwi24_rLyfX3AhVVK80KHf-fDDoQxA16BAhiEAs"
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

API Графа знаний Google

В качестве альтернативы вы можете использовать Google Knowledge Graph API от SerpApi. SerpApi — это бесплатный API со 100 поисками в месяц. Если вам нужно больше поисков, существуют платные тарифные планы.

Разница в том, что вы получите готовый структурированный JSON, и вам не нужно будет искать нужные селекторы, которые могут меняться со временем, обходить блокировку от Google и поддерживать решение, написанное с нуля. Проверьте игровую площадку.

Сначала нам нужно установить google-search-results-nodejs. Для этого в консоли нужно ввести: npm i google-search-results-nodejs.

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

const searchString = "tesla";                           // what we want to search

const params = {
  engine: "google",                                     // search engine
  q: searchString,                                      // search query
  google_domain: "google.com",                          // google domain of the search
  gl: "us",                                             // parameter defines the country to use for the Google search
  hl: "en",                                             // Parameter defines the language to use for the Google search
};

const getKnowledgeGraph = function ({ knowledge_graph }) {
  const allInfo = {
    title: '',
    type: '',
    image: '',
    website: '',
    description: {},
    main: {},
    profiles: {},
    peopleAlsoSearchFor: {}
  } 
    for (const key in knowledge_graph) {
        if (key.includes('_link') || key.includes('_stick') || key === "see_results_about") {
        } else if (key === 'title') {
          allInfo.title = knowledge_graph[key]
        } else if (key === 'type') {
          allInfo.type = knowledge_graph[key]
        } else if (key === 'image') {
          allInfo.image = knowledge_graph[key]
        } else if (key === 'website') {
          allInfo.website = knowledge_graph[key]
        } else if (key === 'description') {
          allInfo.description.text = knowledge_graph[key];
        } else if (key === 'source') {
          allInfo.description.source = knowledge_graph[key].name;
          allInfo.description.link = knowledge_graph[key].link;
        } else if (key === 'profiles') {
          allInfo.profiles = knowledge_graph[key].reduce((acc, el) => {
            return { ...acc, [el.name]: el.link };
          }, {});
        } else if (key === 'people_also_search_for') {
          allInfo.peopleAlsoSearchFor = knowledge_graph[key].reduce((acc, el) => {
            return { ...acc, [el.name]: el.link };
          }, {});
        } else {
          allInfo.main = {...allInfo.main, [key]: knowledge_graph[key]}
    }
  }
  return allInfo
};

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

getJson(params).then(getKnowledgeGraph).then(console.log)
Вход в полноэкранный режим Выйти из полноэкранного режима

Объяснение кода

Объявите константы из необходимых библиотек:

const SerpApi = require("google-search-results-nodejs");
const search = new SerpApi.GoogleSearch(API_KEY);
Войти в полноэкранный режим Выйти из полноэкранного режима
Код Объяснение
SerpApi Библиотека SerpApi Node.js
search новый экземпляр класса GoogleSearch
API_KEY ваш API-ключ от SerpApi

Далее пишем, что мы хотим искать, и необходимые параметры для составления запроса:

const searchString = "tesla";

const params = {
  engine: "google",
  q: searchString,
  google_domain: "google.com",
  gl: "us",
  hl: "en",
};
Войти в полноэкранный режим Выйти из полноэкранного режима
Код Пояснение
searchString что мы хотим искать
engine поисковая система
q поисковый запрос
google_domain домен google: google.com, google.de, google.fr
gl параметр определяет страну, которую следует использовать для поиска Google
hl параметр определяет язык, который будет использоваться для поиска Google.

Далее мы напишем функцию обратного вызова, в которой опишем, какие данные нам нужны из результата нашего запроса:

const getKnowledgeGraph = function ({ knowledge_graph }) {
  const allInfo = {
    title: '',
    type: '',
    image: '',
    website: '',
    description: {},
    main: {},
    profiles: {},
    peopleAlsoSearchFor: {}
  } 
    for (const key in knowledge_graph) {
        if (key.includes('_link') || key.includes('_stick') || key === "see_results_about") {
        } else if (key === 'title') {
          allInfo.title = knowledge_graph[key]
        } else if (key === 'type') {
          allInfo.type = knowledge_graph[key]
        } else if (key === 'image') {
          allInfo.image = knowledge_graph[key]
        } else if (key === 'website') {
          allInfo.website = knowledge_graph[key]
        } else if (key === 'description') {
          allInfo.description.text = knowledge_graph[key];
        } else if (key === 'source') {
          allInfo.description.source = knowledge_graph[key].name;
          allInfo.description.link = knowledge_graph[key].link;
        } else if (key === 'profiles') {
          allInfo.profiles = knowledge_graph[key].reduce((acc, el) => {
            return { ...acc, [el.name]: el.link };
          }, {});
        } else if (key === 'people_also_search_for') {
          allInfo.peopleAlsoSearchFor = knowledge_graph[key].reduce((acc, el) => {
            return { ...acc, [el.name]: el.link };
          }, {});
        } else {
          allInfo.main = {...allInfo.main, [key]: knowledge_graph[key]}
    }
  }
  return allInfo
};
Войти в полноэкранный режим Выйти из полноэкранного режима
Код Пояснение
knowledge_graph объект, который мы деструктурировали из ответа
allInfo мы определяем объект и создаем структуру, как в странице
{...acc, [el.name]: el.link} в этом коде мы используем синтаксис spread для создания объекта из результата, который был возвращен из предыдущего вызова reduce, и добавляем в этот объект новый элемент с ключом el.name и значением el.link.

Также нам нужно итерировать наш объект knowledge_graph вместо того, чтобы просто получать данные типа const allInfo = {title: knowledge_graph.title, ...}, потому что данные (имена ключей), которые я назвал main, меняются с разными поисковыми запросами в объекте knowledge_graph.

Далее мы обернем метод поиска из библиотеки SerpApi в обещание для дальнейшей работы с результатами поиска и запустим его:

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

getJson(params).then(getKnowledgeGraph).then(console.log)
Войти в полноэкранный режим Выйти из полноэкранного режима

Вывести

{
  "title": "Tesla, Inc.",
  "type": "Automotive company",
  "image": "https://serpapi.com/searches/628b8735c9de453fe70b510f/images/1a7dfb07b83eed4f02ee96a98be925e974d4df171887903d.png",
  "website": "http://www.tesla.com/",
  "description": {
    "text": "Tesla, Inc. is an American automotive and clean energy company based in Austin, Texas. Tesla designs and manufactures electric vehicles, battery energy storage from home to grid-scale, solar panels and solar roof tiles, and related products and services.",
    "source": "Wikipedia",
    "link": "https://en.wikipedia.org/wiki/Tesla,_Inc."
  },
  "main": {
    "customer_service_chat": "Online Chat",
    "stock_price": "TSLA (NASDAQ) $663.90 0.00 (0.00%)May 20, 4 - 00 PM EDT - Disclaimer",
    "customer_service": "1 (888) 518-3752",
    "sales": "1 (650) 681-5100",
    "founded": "July 1, 2003, San Carlos, CA",
    "headquarters": "Austin, TX",
    "founders": "Elon Musk, Martin Eberhard, JB Straubel, Marc Tarpenning, Ian Wright",
    "latest_models": [
      {
        "name": "2022 Tesla Model 3",
        "link": "https://www.google.com/search?gl=us&hl=en&q=2022+Tesla+Model+3&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LEoxyzUwLqvQEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWVzDewcoIAL7IDD1JAAAA&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhbEAQ",
        "serpapi_link": "https://serpapi.com/search.json?device=desktop&engine=google&gl=us&google_domain=google.com&hl=en&q=2022+Tesla+Model+3&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LEoxyzUwLqvQEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWVzDewcoIAL7IDD1JAAAA",
        "image": "https://serpapi.com/searches/628b8735c9de453fe70b510f/images/1a7dfb07b83eed4f02ee96a98be925e99c59f5f2d71c9ea5561e55bdf61e24cadcb4829328a89a90.jpeg"
      },
      {
        "name": "2022 Tesla Model Y",
        "link": "https://www.google.com/search?gl=us&hl=en&q=2022+Tesla+Model+Y&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LEqxrCgptCzWEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWV4jcwcoIAPfknH5JAAAA&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhbEAY",
        "serpapi_link": "https://serpapi.com/search.json?device=desktop&engine=google&gl=us&google_domain=google.com&hl=en&q=2022+Tesla+Model+Y&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LEqxrCgptCzWEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWV4jcwcoIAPfknH5JAAAA",
        "image": "https://serpapi.com/searches/628b8735c9de453fe70b510f/images/1a7dfb07b83eed4f02ee96a98be925e99c59f5f2d71c9ea50307ca9e270b1cba5b983d776f28ce53.jpeg"
      },
      {
        "name": "2022 Tesla Model S",
        "link": "https://www.google.com/search?gl=us&hl=en&q=2022+Tesla+Model+S&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LIovN0sqLE_XEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWVwjewcoIANpU_c1JAAAA&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhbEAg",
        "serpapi_link": "https://serpapi.com/search.json?device=desktop&engine=google&gl=us&google_domain=google.com&hl=en&q=2022+Tesla+Model+S&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LIovN0sqLE_XEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWVwjewcoIANpU_c1JAAAA",
        "image": "https://serpapi.com/searches/628b8735c9de453fe70b510f/images/1a7dfb07b83eed4f02ee96a98be925e99c59f5f2d71c9ea5c9f47ee764fde2f1e79caf855134005d.jpeg"
      },
      {
        "name": "2022 Tesla Model X",
        "link": "https://www.google.com/search?gl=us&hl=en&q=2022+Tesla+Model+X&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LEqxKDMtN0_SEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWV4jYwcoIAFWdvepJAAAA&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhbEAo",
        "serpapi_link": "https://serpapi.com/search.json?device=desktop&engine=google&gl=us&google_domain=google.com&hl=en&q=2022+Tesla+Model+X&stick=H4sIAAAAAAAAAONgFuLUz9U3SCmyNEhR4tVP1zc0LEqxKDMtN0_SEnbOzy1IzKsMyffNT0nNiUxNLCpexCpkZGBkpBCSWpyTqAAWV4jYwcoIAFWdvepJAAAA",
        "image": "https://serpapi.com/searches/628b8735c9de453fe70b510f/images/1a7dfb07b83eed4f02ee96a98be925e99c59f5f2d71c9ea5f246cc054e2a0060fbff0bd16f3567fb.jpeg"
      }
    ]
  },
  "profiles": {
    "Twitter": "https://twitter.com/Tesla",
    "LinkedIn": "https://www.linkedin.com/company/tesla-motors",
    "Instagram": "https://www.instagram.com/teslamotors",
    "YouTube": "https://www.youtube.com/user/TeslaMotors",
    "Facebook": "https://www.facebook.com/electriceverywhere/"
  },
  "peopleAlsoSearchFor": {
    "Rivian": "https://www.google.com/search?gl=us&hl=en&q=Rivian&si=AC1wQDBgv4q3A2ojf086TvVgL6tTfKEZW2vrlR3V2uQ-r4wcbsReC3ET6H2gzOSJ83emah_DqBM87DBklcE_mqoTL6cnz4FB1PMxbYfHDHyZdLCyx8zARIwys088KWe7WiklQlXZK_a7dUf-yHR9rfskLPg5guGpehAFTM3fd3hWpBPW5dczKTfsYPqr14le6A9ntskIhEz3TcTFs-NfV-pYomsgg4TqTCwEZ2q78gSuQ2k7lCmM2RK7N6D_QrOJII8refqi1sQCnF5fSz2dpVnhex28ek6DZBQAIBWnfpqfBT0TR8mmzQY%3D&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhcEAU",
    "Porsche": "https://www.google.com/search?gl=us&hl=en&q=Porsche&si=AC1wQDCwN61-ebmuwbQCO5QCrgOvEq5bkWeIzJ5JczItzAKNdRDXvnuw4L4VhlFx9HJV6OqmqtHAqzPbjVJQTwLot5VNg5xzaaCA4jSgbzJaVgihv2J3-LIDNlX1WqL91VSm_FeZk82jX-bHWYKn10Fi0s1BJzHTawI0qAtv96gwjDkx7V_htiR2kxFVzA7AQ4cQCw3CJ6Ip1UkJtRCk5CfuKq3PhLki8BfCXnAWXVPJ7q8ySkdC74wGOae908caHajpT8We8-UmIUtPdHFJCOecopicrNqwbDKyCtQFvP-2Q5CY5uyu2DA%3D&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhcEAc",
    "NIO": "https://www.google.com/search?gl=us&hl=en&q=NIO&si=AC1wQDAXKblb4YtxZaDquKpQ5Js55CVph8NS1FIwBhgs6qyyHkehlU67aH1NSQuNhCW8DVAYZPw0DpddMm6wTKTN_Bvaze-B5FZFuI7smOYC3exZRBqB1hk0qKg9Kiv1fQ59L8TBbBAU8OOK0XFI4nAnmzy7G1NxHWMC_rq2hInqckB6GzyuGbsYEFixmX3yYpjCk9nUgVi_bvFQ-uWAdGaEZEaX-TpmPVtqjgcckC13fXyJMz-b8twpo4MntcWGbO06ceNB2YD9IvnaliU-XIfwHtOZc2pEhvax5L1V4cNA2sXlCyiTCx0%3D&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhcEAk",
    "Sunrun": "https://www.google.com/search?gl=us&hl=en&q=Sunrun&si=AC1wQDBgv4q3A2ojf086TvVgL6tTfKEZW2vrlR3V2uQ-r4wcbmSu5nhquKqWlG2lGADH9r4kgGmXn4Lx085H40Gw8Qkq5MAMrE_2zOdeGSFnxbNwaYps0-scCzFFuAgxHXGMOmaKcxEYHFbpyU29GQaUYPgTlYfFkN9MHAcmUOFQVoDAAuPOSgbHN3qoHZP7jZiqoHw74zfkgeYScjelV-aWW1jx8mBj4pStMhjKSwEoLlri5O63Di9LXMX9LIAasThnFWea1p-jMKTqh4GUWrQXSjXOMFRGAgS_uBO7Fkfe0-vXKOx77A0%3D&sa=X&ved=2ahUKEwjSlIW_2PX3AhVIgnIEHZbWC48QxA16BAhcEAs"
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Ссылки

  • Код в онлайн IDE
  • Google Knowledge Graph API

Если вы хотите увидеть какой-нибудь проект, сделанный с помощью SerpApi, пожалуйста, напишите мне сообщение.


Присоединяйтесь к нам на Twitter | YouTube

Add a Feature Request💫 or a Bug🐞

Оцените статью
Procodings.ru
Добавить комментарий