CoderCastrov logo
CoderCastrov
Парсер веб-страниц

Парсинг рекламных результатов Google с помощью Python

Парсинг рекламных результатов Google с помощью Python
просмотров
9 мин чтение
#Парсер веб-страниц

Как парсить рекламные результаты Google с помощью библиотек Beautiful Soup, Parsel и SerpApi для парсинга веб-страниц.

Что будет парситься


Предварительные требования

Базовое знание парсинга с использованием CSS-селекторов

Селекторы CSS определяют, к какой части разметки применяется стиль, что позволяет извлекать данные из соответствующих тегов и атрибутов.

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

Отдельная виртуальная среда

Вкратце, это инструмент, который создает независимый набор установленных библиотек, включая разные версии Python, которые могут сосуществовать на одной системе, тем самым предотвращая конфликты библиотек или версий Python.

Если вы ранее не работали с виртуальной средой, ознакомьтесь со специальной статьей Руководство по виртуальным средам Python с использованием Virtualenv и Poetry, чтобы ознакомиться с этим инструментом.

📌Примечание: это не строгое требование для данной статьи.

Установка библиотек:

pip install requests, parsel, beautifulsoup4, lxml

Сохранить

📌Примечание: вам не нужно устанавливать и beautifulsoup4, и parsel. В этой статье приведены примеры использования обеих библиотек. Выберите ту, с которой вам будет удобнее работать.

Снижение вероятности блокировки

Существует вероятность, что запрос может быть заблокирован. Ознакомьтесь с как снизить вероятность блокировки при парсинге веб-страниц, где описаны одиннадцать методов обхода блокировок на большинстве веб-сайтов.


Результаты регулярных объявлений Google

# Используем beautifulsoup
from bs4 import BeautifulSoup
import requests, lxml, json

params = {
    "q": "купить кофейные зерна",
    "hl": "ru",
    "gl": "ru"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
}

html = requests.get("https://www.google.com/search?", params=params, headers=headers)
soup = BeautifulSoup(html.text, "lxml")
ad_results = []

for index, ad_result in enumerate(soup.select(".uEierd"), start=1):
    title = ad_result.select_one(".v0nnCb span").text
    website_link = ad_result.select_one("a.sVXRqc")["data-pcu"]
    ad_link = ad_result.select_one("a.sVXRqc")["href"]
    displayed_link = ad_result.select_one(".qzEoUe").text
    tracking_link = ad_result.select_one(".v5yQqb a.sVXRqc")["data-rw"]
    snippet = ad_result.select_one(".MUxGbd div span").text
    phone = None if ad_result.select_one("span.fUamLb span") is None else ad_result.select_one("span.fUamLb span").text
    inline_link_text = [title.text for title in ad_result.select("div.bOeY0b .XUpIGb a")]
    inline_link = [link["href"] for link in ad_result.select("div.bOeY0b .XUpIGb a")]

    ad_results.append({
        "position": index,
        "title": title,
        "phone": phone,
        "website_link": website_link,
        "displayed_link": displayed_link,
        "ad_link": ad_link,
        "tracking_link": tracking_link,
        "snippet": snippet,
        "sitelinks": [{"titles": inline_link_text, "links": inline_link}]
    })

print(json.dumps(ad_results, indent=2))

Сохранить

Создать параметры поискового запроса и заголовки запроса:

# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
params = {
    "q": "купить кофейные зерна",
    "hl": "ru",
    "gl": "ru"
}

# https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
}

Сохранить

Сделать запрос, передать заголовки и параметры поискового запроса, создать объект BeautifulSoup() и временный список для хранения извлеченных данных:

html = requests.get("https://www.google.com/search", params=params, headers=headers)
selector = BeautifulSoup(html.text)
ad_results = []

Сохранить

Извлечь данные, добавить их во временный список и вывести их на экран, чтобы увидеть результат:

for index, ad_result in enumerate(soup.select(".uEierd"), start=1):
    title = ad_result.select_one(".v0nnCb span").text
    website_link = ad_result.select_one("a.sVXRqc")["data-pcu"]
    ad_link = ad_result.select_one("a.sVXRqc")["href"]
    displayed_link = ad_result.select_one(".qzEoUe").text
    tracking_link = ad_result.select_one(".v5yQqb a.sVXRqc")["data-rw"]
    snippet = ad_result.select_one(".MUxGbd div span").text
    phone = None if ad_result.select_one("span.fUamLb span") is None else ad_result.select_one("span.fUamLb span").text
    inline_link_text = [title.text for title in ad_result.select("div.bOeY0b .XUpIGb a")]
    inline_link = [link["href"] for link in ad_result.select("div.bOeY0b .XUpIGb a")]

    ad_results.append({
        "position": index,
        "title": title,
        "phone": phone,
        "website_link": website_link,
        "displayed_link": displayed_link,
        "ad_link": ad_link,
        "tracking_link": tracking_link,
        "snippet": snippet,
        "sitelinks": [{"titles": inline_link_text, "links": inline_link}]
    })

print(json.dumps(ad_results, indent=2))

Сохранить

Вывод:

[
  {
    "position": 1,
    "title": "Кофейные зерна Bluestone Lane - Прямо к вам домой",
    "phone": "(718) 374-6858",
    "website_link": "https://shop.bluestonelane.com/",
    "displayed_link": "https://shop.bluestonelane.com/shop-online/beans",
    "ad_link": "https://shop.bluestonelane.com/collections/coffee",
    "tracking_link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiP6r3a-rv2AhUGqpYKHdQzCsgYABAEGgJ0bA&ae=2&sig=AOD64_1zlaVI5SseAcinZkdqJ8NE73vcDw&q&adurl",
    "snippet": "Сэкономьте 10% на еженедельной доставке кофе домой. Идеальный налитый кофе, прямо к вашей двери. Теперь можно купить кофейные зерна Bluestone Lane! Вдохновленный Австралией кофе. Здоровый.",
    "sitelinks": [
      {
        "titles": [
          "Скачать новое приложение лояльности",
          "Наше обязательство",
          "Подпишитесь сегодня",
          "Фильтр Blend 12oz Coffee"
        ],
        "links": [
          "https://www.google.com/aclk?sa=l&ai=DChcSEwiP6r3a-rv2AhUGqpYKHdQzCsgYABAJGgJ0bA&ae=2&sig=AOD64_0xTS8u7xoSaM1L2zpjHW72MVf2rA&q=&ved=2ahUKEwjAorfa-rv2AhV0IqYKHV9GBogQpigoAHoECAUQBw&adurl=",
          "https://www.google.com/aclk?sa=l&ai=DChcSEwiP6r3a-rv2AhUGqpYKHdQzCsgYABAPGgJ0bA&ae=2&sig=AOD64_2iLZxTyzQIy4E-ppYcvnXR0N5NjQ&q=&ved=2ahUKEwjAorfa-rv2AhV0IqYKHV9GBogQpigoAXoECAUQCA&adurl=",
          "https://www.google.com/aclk?sa=l&ai=DChcSEwiP6r3a-rv2AhUGqpYKHdQzCsgYABAVGgJ0bA&ae=2&sig=AOD64_0EoBw_9CBqxqAOZdMI8q74-Ze_WQ&q=&ved=2ahUKEwjAorfa-rv2AhV0IqYKHV9GBogQpigoAnoECAUQCQ&adurl=",
          "https://www.google.com/aclk?sa=l&ai=DChcSEwiP6r3a-rv2AhUGqpYKHdQzCsgYABAbGgJ0bA&ae=2&sig=AOD64_2sn0YN-maincAYRdu_nANJvF83fg&q=&ved=2ahUKEwjAorfa-rv2AhV0IqYKHV9GBogQpigoA3oECAUQCg&adurl="
        ]
      }
    ]
  }, ... другие результаты
]

Сохранить


# Используем parsel
from parsel import Selector
import requests, json

params = {
    "q": "купить кофейные зерна",
    "hl": "ru",
    "gl": "ru"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
}

html = requests.get("https://www.google.com/search", params=params, headers=headers)
selector = Selector(html.text)
ad_results = []

for index, ad_result in enumerate(selector.css(".uEierd"), start=1):
    title = ad_result.css(".v0nnCb span::text").get()
    website_link = ad_result.css("a.sVXRqc::attr(data-pcu)").get()
    ad_link = ad_result.css("a.sVXRqc::attr(href)").get()
    displayed_link = ad_result.css(".qzEoUe::text").get()
    tracking_link = ad_result.css(".v5yQqb a.sVXRqc::attr(data-rw)").get()
    snippet = ad_result.css(".MUxGbd div span").xpath("normalize-space()").get()
    phone = ad_result.css("span.fUamLb span::text").get()
    inline_link_text = None if ad_result.css("div.bOeY0b .XUpIGb a::text").getall() == [] else ad_result.css("div.bOeY0b .XUpIGb a::text").getall()
    inline_link = None if ad_result.css("div.bOeY0b .XUpIGb a::attr(href)").getall() == [] else ad_result.css("div.bOeY0b .XUpIGb a::attr(href)").getall()

    ad_results.append({
        "position": index,
        "title": title,
        "phone": phone,
        "website_link": website_link,
        "displayed_link": displayed_link,
        "ad_link": ad_link,
        "tracking_link": tracking_link,
        "snippet": snippet,
        "sitelinks": [{"titles": inline_link_text, "links": inline_link}]
    })

print(json.dumps(ad_results, indent=2))

Сохранить

Создать параметры поискового запроса и заголовки запроса:

# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
params = {
    "q": "купить кофейные зерна",
    "hl": "ru",
    "gl": "ru"
}

# https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
}

Сохранить

Сделать запрос, передать заголовки и параметры поискового запроса, создать объект Selector() и временный список для хранения извлеченных данных:

html = requests.get("https://www.google.com/search", params=params, headers=headers)
selector = Selector(html.text)
ad_results = []

Сохранить

Извлечь данные, добавить их во временный список и вывести их на экран, чтобы увидеть результат:

for index, ad_result in enumerate(selector.css(".uEierd"), start=1):
    title = ad_result.css(".v0nnCb span::text").get()
    website_link = ad_result.css("a.sVXRqc::attr(data-pcu)").get()
    ad_link = ad_result.css("a.sVXRqc::attr(href)").get()
    displayed_link = ad_result.css(".qzEoUe::text").get()
    tracking_link = ad_result.css(".v5yQqb a.sVXRqc::attr(data-rw)").get()
    snippet = ad_result.css(".MUxGbd div span").xpath("normalize-space()").get()
    phone = ad_result.css("span.fUamLb span::text").get()
    inline_link_text = None if ad_result.css("div.bOeY0b .XUpIGb a::text").getall() == [] else ad_result.css("div.bOeY0b .XUpIGb a::text").getall()
    inline_link = None if ad_result.css("div.bOeY0b .XUpIGb a::attr(href)").getall() == [] else ad_result.css("div.bOeY0b .XUpIGb a::attr(href)").getall()

    ad_results.append({
        "position": index,
        "title": title,
        "phone": phone,
        "website_link": website_link,
        "displayed_link": displayed_link,
        "ad_link": ad_link,
        "tracking_link": tracking_link,
        "snippet": snippet,
        "sitelinks": [{"titles": inline_link_text, "links": inline_link}]
    })

print(json.dumps(ad_results, indent=2))

Сохранить

  • enumerate() добавляет счетчик к итерируемому объекту и возвращает его, а start=1 начинает счет с 1, а не с 0.
  • css() обрабатывает переданные CSS-селекторы для манипуляции с XML/HTML-документом. Это похоже на методы select() или select_one() в beautifulsoup.
  • ::text и ::attr(<имя_атрибута>) - это псевдо-элементы parsel которые преобразуются в XPath, используя [cssselct](https://cssselect.readthedocs.io/en/latest/index.html) под капотом.
  • xpath("normalize-space()") получает пустые текстовые узлы, так как /text() игнорирует пустые текстовые узлы.
  • Выражение inline_link_text в операторе if вернет None, если селектор вернет [], в противном случае он вернет list совпадающих данных. То же самое относится к извлечению атрибута attr(href).
  • getall() вернет list совпадений.

Вывод:

[
  {
    "position": 1,
    "title": "Наш кофе, ваша чашка - Прямо к вам домой - bluestonelane.com",
    "phone": "(718) 374-6858",
    "website_link": "https://shop.bluestonelane.com/",
    "displayed_link": "https://shop.bluestonelane.com/shop-online/beans",
    "ad_link": "https://shop.bluestonelane.com/collections/coffee",
    "tracking_link": "https://www.google.com/aclk?sa=l&ai=DChcSEwjyvZ7a-7v2AhXKIWAKHbB0CPUYABADGgJ0bQ&ae=2&sig=AOD64_36gM2Qo8gyYFj6BGQ2TBWx6UchxQ&q&adurl",
    "snippet": "Приготовьте Flagstaff дома: наш сбалансированный и доступный смесь для капельной кофеварки. Сэкономьте 10% на еженедельной доставке кофе домой. Вдохновленный Австралией кофе. Вдохновленный Австралией.",
    "sitelinks": [
      {
        "titles": null,
        "links": null
      }
    ]
  }, ... другие результаты
]

Сохранить


Результаты рекламы Google Shopping

# с использованием BeautifulSoup
# обрабатывает как верхние, так и правые результаты рекламы в блоках# если появляется верхний блок рекламы Google Shopping
if soup.select_one(".commercial-unit-desktop-top"):
    for index, shopping_ad in enumerate(soup.select(".mnr-c.pla-unit"), start=1):
        title = shopping_ad.select_one(".pymv4e").text
        link = shopping_ad.select_one(".pla-unit-title-link")["href"]
        price = shopping_ad.select_one(".e10twf").text
        source = shopping_ad.select_one(".LbUacb .zPEcBd").text        data.append({
            "position": index,
            "block_position": "верхний_блок",
            "title": title,
            "link": link,
            "price": price,
            "source": source
            })# если появляется правый блок рекламы Google Shopping
elif soup.select_one(".commercial-unit-desktop-rhs"):
    for index, shopping_ad in enumerate(soup.select(".mnr-c.pla-unit"), start=1):
        title = shopping_ad.select_one(".pymv4e").text
        link = shopping_ad.select_one(".pla-unit-title-link")["href"]
        price = shopping_ad.select_one(".e10twf").text
        source = shopping_ad.select_one(".LbUacb, .zPEcBd").text        data.append({
            "position": index,
            "block_position": "правый_блок",
            "title": title,
            "link": link,
            "price": price,
            "source": source
            })print(json.dumps(data, indent=2, ensure_ascii=False))

Сохранить


# с использованием parsel
# обрабатывает как верхние, так и правые результаты рекламы Google Shoppingfrom parsel import Selector
import requests, json# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
params = {
    "q": "купить видеокарту",
    "hl": "ru",
    "gl": "ru"
    }# https://docs.python-requests.org/en/master/user/quickstart/#custom-headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",
    }html = requests.get("https://www.google.com/search", params=params, headers=headers, timeout=30)
selector = Selector(html.text)data = []# если появляется верхний блок рекламы Google Shopping
if selector.css(".commercial-unit-desktop-top").get():
    for index, shopping_ad in enumerate(selector.css(".mnr-c.pla-unit"), start=1):
        title = shopping_ad.css(".pymv4e::text").get()
        link = shopping_ad.css(".pla-unit-title-link::attr(href)").get()
        price = shopping_ad.css(".e10twf::text").get()
        source = shopping_ad.css(".LbUacb .zPEcBd::text").get()        data.append({
            "position": index,
            "block_position": "верхний_блок",
            "title": title,
            "link": link,
            "price": price,
            "source": source
            })# если появляется правый блок рекламы Google Shopping
elif selector.css(".commercial-unit-desktop-rhs").get():
    for index, shopping_ad in enumerate(selector.css(".mnr-c.pla-unit"), start=1):
        title = shopping_ad.css(".pymv4e::text").get()
        link = shopping_ad.css(".pla-unit-title-link::attr(href)").get()
        price = shopping_ad.css(".e10twf::text").get()
        source = shopping_ad.css(".LbUacb::text, .zPEcBd::text").get()        data.append({
            "position": index,
            "block_position": "правый_блок",
            "title": title,
            "link": link,
            "price": price,
            "source": source
            })print(json.dumps(data, indent=2, ensure_ascii=False))

Сохранить

Результаты верхнего блока:

[
  {
    "position": "верхний_блок",
    "title": "Видеокарта Gigabyte GeForce RTX 3080 Ti Gaming OC 12288MB (GV-N308TGAMING OC-12GD)",
    "link": "https://telemart.ua/ua/products/gigabyte-geforce-rtx-3080-ti-gaming-oc-12288mb-gv-n308tgaming-oc-12gd/",
    "price": "61 999,00 грн",
    "source": "telemart.ua"
  }, ... другие результаты
  {
    "position": "верхний_блок",
    "title": "Gigabyte GeForce RTX 3080 VISION OC 10G (rev. 2.0) NVIDIA 10 GB GDDR6X",
    "link": "https://www.grooves.land/gigabyte-geforce-rtx-3080-vision-10g-rev-grafikkarten-rtx-3080-gddr6x-pcie-x16-hdmi-displayport-gigabyte-hardware-electronic-pZZa1-2100509896.html?language=en&currency=EUR&_z=ua",
    "price": "38 359,03 грн",
    "source": "Grooves.Land"
  }
]

Сохранить

Результаты правого блока:

[
  {
    "position": "правый_блок",
    "title": "MSI GeForce RTX 2060 Ventus 12G OC NVIDIA 12 GB GDDR6",
    "link": "https://www.grooves.land/msi-geforce-rtx-2060-ventus-12gb-grafikkarte-msi-hardware-electronic-pZZa1-2100485027.html?language=en&currency=EUR&_z=ua",
    "price": "16 210,82 грн",
    "source": "Grooves.Land"
  }, ... другие результаты
 {
    "position": "правый_блок",
    "title": "RTX 3060Ti 8GB MSI VENTUS 2X 8G OCV1 LHR Hardware/Electronic",
    "link": "https://www.grooves.land/msi-geforce-rtx-3060-ventus-ocv1-lhr-grafikkarten-rtx-3060-gddr6-pcie-hdmi-displayport-msi-hardware-electronic-pZZa1-2100386549.html?language=en&currency=EUR&_z=ua",
    "price": "20 997,98 грн",
    "source": "Grooves.Land"
  }
]

Сохранить


Кроме того, вы можете использовать API результатов рекламы Google от SerpApi.

При использовании API нет необходимости создавать парсер с нуля, поддерживать его со временем, разбираться, как его масштабировать и как обойти блокировки от поисковых систем. Попробуйте использовать SerpApi.

# скрапит как обычные, так и рекламные результаты (верхний блок, правый блок)from serpapi import GoogleSearch
import json, osparams = {
    "api_key": os.getenv("API_KEY"),
    "engine": "google",
    "q": "купить видеокарту",
    "gl": "ru",
    "hl": "ru"
}search = GoogleSearch(params)
results = search.get_dict()if results.get("ads", []):
    for ad in results["ads"]:
        print(json.dumps(ad, indent=2))if results.get("shopping_results", []):
    for shopping_ad in results["shopping_results"]:
        print(json.dumps(shopping_ad, indent=2))
else:
    print("рекламных результатов не найдено.")

Сохранить

Результаты обычной рекламы:

{
  "position": 1,
  "block_position": "верхний",
  "title": "Специальные сорта кофейных зерен - Доставка специального кофе",
  "link": "https://www.bottomless.com/",
  "displayed_link": "https://www.bottomless.com/",
  "tracking_link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABACGgJxbg&ae=2&sig=AOD64_0z23Z-mc1OkEpczNz-x2yF5YLSsQ&q&adurl",
  "extensions": [
    "\u200eShop Products \u00b7 \u200eCoffee Subscription \u00b7 \u200eSend A Bottomless Gift \u00b7 \u200eCareers \u00b7 \u200ePartnerships \u00b7 \u200eGet Started \u00b7 \u200eFAQs \u00b7 \u200eBlog"
  ],
  "description": "Больше не нужно покупать кофейные зерна в магазине с нашей автоматической доставкой кофе.",
  "sitelinks": [
    {
      "title": "Shop Products",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABADGgJxbg&ae=2&sig=AOD64_0HYHHtwrsAIGomuNVmydPd7v2TUA&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoAHoECAQQBQ&adurl="
    },
    {
      "title": "Coffee Subscription",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABAEGgJxbg&ae=2&sig=AOD64_3wLVBOmaIcctrg5eeIpXUjncI8sg&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoAXoECAQQBg&adurl="
    },
    {
      "title": "Send A Bottomless Gift",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABAFGgJxbg&ae=2&sig=AOD64_2QwYx_VHhBAzXoagpeVSVrLlUEqg&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoAnoECAQQBw&adurl="
    },
    {
      "title": "Careers",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABAGGgJxbg&ae=2&sig=AOD64_2hIva8QgcQLurgDS09y-cwQONJsg&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoA3oECAQQCA&adurl="
    },
    {
      "title": "Partnerships",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABAHGgJxbg&ae=2&sig=AOD64_2GyFC-hVyKRZzNwqxuCEJo0zu4qw&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoBHoECAQQCQ&adurl="
    },
    {
      "title": "Get Started",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABAIGgJxbg&ae=2&sig=AOD64_3Xfw361uyxsaVLWQQEwdDsSaVlNQ&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoBXoECAQQCg&adurl="
    },
    {
      "title": "FAQs",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABAJGgJxbg&ae=2&sig=AOD64_04tmkV2h42w8JZZII5WxfD6SLqow&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoBnoECAQQCw&adurl="
    },
    {
      "title": "Blog",
      "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwiolvLqiM32AhUKnLMKHaQJC-sYABAKGgJxbg&ae=2&sig=AOD64_3f_UEHA546-i91dlA4_u0nIWhNCQ&q=&ved=2ahUKEwjKxenqiM32AhUxq3IEHcu2CvEQpigoB3oECAQQDA&adurl="
    }
  ]
} ... другие результаты

Сохранить

Результаты рекламы Google Shopping:

{
  "position": 1,
  "block_position": "верхний",
  "title": "ASUS GeForce RTX 3080 Ti TUF Gaming OC Graphics Card Chipset NVIDIA, 12GB, Windows, DisplayPort 1.4 HDMI 2.1 5, Ports 2.1 x2, 1.4 x3, Bus PCIe 4.0 x16",
  "price": "$1,949.99",
  "extracted_price": 1949.99,
  "link": "https://www.google.com/aclk?sa=l&ai=DChcSEwj-ouaTic32AhXuam8EHTWvCRsYABAFGgJqZg&ae=2&sig=AOD64_3KbwY-1-lU3sxYJrrCtTuQ4vD1QA&ctype=5&q=&ved=2ahUKEwi6ytyTic32AhXck2oFHRLuA-gQ5bgDegQIARA5&adurl=",
  "source": "B&H Photo-Vid...",
  "reviews": 139,
  "thumbnail": "https://serpapi.com/searches/62331f6c2f542e30940b588f/images/f33950a51d54d017faac86bbc552ceadcb0d642f5a3d5ea2230be8c5c62ddd9c.png"
} ... другие результаты

Сохранить


Ссылки


Заключение

Если у вас есть что-то, что вы хотите поделиться, вопросы, предложения или что-то, что работает неправильно, свяжитесь с нами через Twitter по адресу @dimitryzub или @serp_api.

С уважением, Дмитрий и остальная команда SerpApi.


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

Добавьте запрос на функцию💫 или ошибку🐞


_Больше контента на _plainenglish.io