برنامه نویسی

اطلاعات محصول را از Bing Shopping با پایتون و SerpApi دریافت کنید

چه چیزی تراشیده خواهد شد

wwbs-bing-shopping

📌توجه: نتایج خرید درون خطی ممکن است همیشه وجود نداشته باشد.

کد کامل

اگر نیازی به توضیح ندارید، به نمونه کد کامل در IDE آنلاین نگاهی بیندازید.

from selectolax.lexbor import LexborHTMLParser
import requests, json, re


def get_inline_shopping_results(parser: LexborHTMLParser, product_counter: int) -> list:
    data = []

    for position, product in enumerate(parser.root.css('.br-gOffCard'), start=product_counter):
        raw_title = product.css_first('.br-offTtl span')
        raw_shipping = product.css_first('.br-offDec')
        raw_rating = product.css_first('.tags > span')

        title = raw_title.attributes.get('title', '') if raw_title else product.css_first('.br-offTtl').text().strip()
        product_link = product.css_first('.br-offLink').attributes.get('href', '')
        brand = product.css_first('.br-offSecLbl').text().strip() if product.css_first('.br-offSecLbl') else None
        seller = product.css_first('.br-offSlr').text().strip()
        price = product.css_first('.br-price').text().strip()
        # https://regex101.com/r/lap8lr/1
        extracted_price = float(re.search(r'[\d|,|.]+', price).group().replace(',', ''))
        old_price = product.css_first('.br-standardPriceDemoted').text().strip() if product.css_first('.br-standardPriceDemoted') else None
        shipping_text = raw_shipping.text().strip() if raw_shipping else ''
        shipping = shipping_text if 'shipping' in shipping_text else None
        rating_text = raw_rating.attributes.get('aria-label', '') if raw_rating else None
        # https://regex101.com/r/D2YTRI/1
        rating = float(re.search(r'[\d.\d|\d]+', rating_text).group(0)) if rating_text else None
        reviews_text = raw_rating.text().strip() if raw_rating else None
        reviews = reviews_text.replace('(', '').replace(')', '') if reviews_text else None
        thumbnail = product.css_first('.cico img').attributes.get('src', None) if product.css_first('.cico img') else None

        data.append({
            'position': position,
            'title': title,
            'product_link': product_link,
            'brand': brand,
            'seller': seller,
            'price': price,
            'extracted_price': extracted_price,
            'old_price': old_price,
            'shipping': shipping,
            'rating': rating,
            'reviews': reviews,
            'thumbnail': thumbnail
        })

    return data


def get_shopping_results(parser: LexborHTMLParser, product_counter: int) -> list:
    data = []

    for position, product in enumerate(parser.root.css('.br-fullCard'), start=product_counter):
        raw_title = product.css_first('.br-title span')

        title = raw_title.attributes.get('title', '') if raw_title else product.css_first('.br-title').text().strip()
        product_link = f"https://www.bing.com{product.css_first('.br-titlelink').attributes.get('href', '')}"
        seller = product.css_first('.br-seller').text().strip()
        price = product.css_first('.pd-price').text().strip()
        # https://regex101.com/r/lap8lr/1
        extracted_price = float(re.search(r'[\d|,|.]+', price).group().replace(',', ''))
        sale = True if product.css_first('.br-saletag') else False
        old_price = product.css_first('.br-pdOfferPrice').text().strip() if product.css_first('.br-pdOfferPrice') else None
        shipping = product.css_first('.br-decoSlot').text().strip() if product.css_first('.br-decoSlot') else None
        thumbnail = product.css_first('.br-pdMainImg img').attributes.get('src', None) if product.css_first('.br-pdMainImg img') else None

        data.append({
            'position': position,
            'title': title,
            'product_link': product_link,
            'seller': seller,
            'price': price,
            'extracted_price': extracted_price,
            'sale': sale,
            'old_price': old_price,
            'shipping': shipping,
            'thumbnail': thumbnail
        })

    return data


def main():
    # 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/111.0.0.0 Safari/537.36'
    }

    url = 'https://www.bing.com/shop?q=ps4 controller'

    inline_shopping_results_counter: int = 1
    shopping_results_counter: int = 1

    bing_shopping_results = {
        'inline_shopping_results': [],
        'shopping_results': []
    }

    while True:
        html = requests.get(url, headers=headers)
        parser = LexborHTMLParser(html.text)

        inline_shopping_page_results = get_inline_shopping_results(parser, inline_shopping_results_counter)
        bing_shopping_results['inline_shopping_results'].extend(inline_shopping_page_results)

        shopping_page_results = get_shopping_results(parser, shopping_results_counter)
        bing_shopping_results['shopping_results'].extend(shopping_page_results)

        next_page_button = parser.css_first('.sb_pagN_bp')

        if next_page_button:
            url = f"https://www.bing.com{next_page_button.attributes.get('href', '')}"
            inline_shopping_results_counter += len(inline_shopping_page_results)
            shopping_results_counter += len(shopping_page_results)
        else:
            break

    print(json.dumps(bing_shopping_results, indent=2, ensure_ascii=False))


if __name__ == "__main__":
    main()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آماده سازی

کتابخانه ها را نصب کنید

pip install requests selectolax
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

احتمال مسدود شدن را کاهش دهید

مطمئن شوید که از هدر درخواست استفاده می کنید user-agent به عنوان یک بازدید کاربر “واقعی” عمل کند. چون پیش فرض requests user-agent است python-requests و وب سایت ها می دانند که به احتمال زیاد اسکریپتی است که درخواستی را ارسال می کند. بررسی کنید چه چیزی شما است user-agent.

روشی برای کاهش احتمال مسدود شدن هنگام پست وبلاگ وجود دارد که می تواند شما را با رویکردهای اساسی و پیشرفته تر آشنا کند.

توضیح کد

واردات کتابخانه ها:

from selectolax.lexbor import LexborHTMLParser
import requests, json, re
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کتابخانه هدف
LexborHTMLParser تجزیه کننده سریع HTML5 با انتخابگرهای CSS با استفاده از موتور Lexbor.
requests برای ارسال درخواست به وب سایت
json برای تبدیل داده های استخراج شده به یک شی JSON.
re برای استخراج بخش هایی از داده ها از طریق عبارت منظم.

قسمت بعدی کد به توابع تقسیم می شود. هر تابع در عنوان مربوطه در زیر توضیح داده شده است.

محیط کد سطح بالا

سرصفحه های درخواست ایجاد می شوند:

# 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/111.0.0.0 Safari/537.36'
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را url متغیر حاوی پیوندی به صفحه خرید بینگ است:

url = 'https://www.bing.com/shop?q=ps4 controller'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

متغیرهایی برای تعیین موقعیت محصول فعلی با در نظر گرفتن صفحه بندی ایجاد می شوند. به عنوان مثال، اگر در صفحه اول موقعیت آخرین محصول باشد 36، سپس در صفحه دوم موقعیت محصول اول خواهد بود 37 (نه 1):

inline_shopping_results_counter: int = 1
shopping_results_counter: int = 1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

را bing_shopping_results فرهنگ لغت تشکیل می شود، که در آن داده های مربوط به کلیدهای مربوطه متعاقبا اضافه می شود:

bing_shopping_results = {
    'inline_shopping_results': [],
    'shopping_results': []
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درخواست ها در یک حلقه برای هر صفحه ارسال می شوند:

while True:
    # pagination
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درخواست بده، پاس کن url و headers. استخراج داده ها خود با انجام می شود selectolax چون دارد Lexbor تجزیه کننده که فوق العاده سریع است، مانند 186٪ سریعتر در مقایسه با bs4 با lxml Backend هنگام تجزیه داده ها با 3000 تکرار 5 بار:

html = requests.get(url, headers=headers)
parser = LexborHTMLParser(html.text)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با فراخوانی توابع مناسب، تمام داده های لازم بازیابی و در آن نوشته می شود bing_shopping_results فرهنگ لغت. این توابع در بخش های زیر به تفصیل آمده است.

inline_shopping_page_results = get_inline_shopping_results(parser, inline_shopping_results_counter)
bing_shopping_results['inline_shopping_results'].extend(inline_shopping_page_results)

shopping_page_results = get_shopping_results(parser, shopping_results_counter)
bing_shopping_results['shopping_results'].extend(shopping_page_results)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در پایان تکرار، بررسی می کند که آیا دکمه “بعدی” وجود دارد یا خیر. اگر چنین دکمه ای وجود داشته باشد، آدرس و شمارنده ها به روز می شوند. در غیر این صورت، حلقه متوقف می شود.

next_page_button = parser.css_first('.sb_pagN_bp')

if next_page_button:
    url = f"https://www.bing.com{next_page_button.attributes.get('href', '')}"
    inline_shopping_results_counter += len(inline_shopping_page_results)
    shopping_results_counter += len(shopping_page_results)
else:
    break
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از دریافت داده ها از تمام صفحات، آنها با فرمت JSON خروجی می شوند:

print(json.dumps(bing_shopping_results, indent=2, ensure_ascii=False))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کد از boilerplate استفاده می کند __name__ == "__main__" ساختاری که کاربران را از فراخوانی تصادفی اسکریپت در زمانی که قصد ندارند محافظت می کند. این نشان می دهد که کد یک اسکریپت قابل اجرا است:

def main():
    # 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/111.0.0.0 Safari/537.36'
    }

    url = 'https://www.bing.com/shop?q=ps4 controller'

    inline_shopping_results_counter: int = 1
    shopping_results_counter: int = 1

    bing_shopping_results = {
        'inline_shopping_results': [],
        'shopping_results': []
    }

    while True:
        html = requests.get(url, headers=headers)
        parser = LexborHTMLParser(html.text)

        inline_shopping_page_results = get_inline_shopping_results(parser, inline_shopping_results_counter)
        bing_shopping_results['inline_shopping_results'].extend(inline_shopping_page_results)

        shopping_page_results = get_shopping_results(parser, shopping_results_counter)
        bing_shopping_results['shopping_results'].extend(shopping_page_results)

        next_page_button = parser.css_first('.sb_pagN_bp')

        if next_page_button:
            url = f"https://www.bing.com{next_page_button.attributes.get('href', '')}"
            inline_shopping_results_counter += len(inline_shopping_page_results)
            shopping_results_counter += len(shopping_page_results)
        else:
            break

    print(json.dumps(bing_shopping_results, indent=2, ensure_ascii=False))


if __name__ == "__main__":
    main()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این بررسی تنها در صورتی انجام می شود که کاربر این فایل را اجرا کرده باشد. اگر کاربر این فایل را به فایل دیگری وارد کند، بررسی کار نخواهد کرد.

می توانید ویدیوی آموزش پایتون را مشاهده کنید: if نام == ‘اصلیبرای جزئیات بیشتر.

نتایج خرید آنلاین را دریافت کنید

تابع a را می گیرد parser و الف product_counter. فهرستی را با داده های بازیابی شده برمی گرداند.

را data لیستی اعلام می شود که داده های استخراج شده به آن اضافه می شود:

data = []
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای بازیابی همه محصولات از یک صفحه، باید از آن استفاده کنید css() روش و پاس کردن .br-gOffCard انتخابگر وجود دارد

پس از آن، باید با استفاده از حلقه for همراه با داخلی، لیست حاصل از محصولات را تکرار کنید enumerate() تابع. این تابع یک شمارنده به تکرار اضافه می کند و آن را برمی گرداند. شمارنده برای تعیین موقعیت به هر محصول مورد نیاز است:

for position, product in enumerate(parser.root.css('.br-gOffCard'), start=product_counter):
    # data extraction
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بازیابی داده های مورد نیاز به صورت زیر انجام می شود: انتخابگر مورد نیاز برای محصول فعلی را با استفاده از css_first() method، پس از این مقدار متن یا مقدار ویژگی را استخراج می کنیم:

product_link = product.css_first('.br-offLink').attributes.get('href', '')
seller = product.css_first('.br-offSlr').text().strip()
price = product.css_first('.br-price').text().strip()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

داده هایی وجود دارد که ممکن است در برخی از محصولات وجود نداشته باشد. در این مورد، چک ها اضافه می شوند:

raw_title = product.css_first('.br-offTtl span')
raw_shipping = product.css_first('.br-offDec')
raw_rating = product.css_first('.tags > span')

title = raw_title.attributes.get('title', '') if raw_title else product.css_first('.br-offTtl').text().strip()
brand = product.css_first('.br-offSecLbl').text().strip() if product.css_first('.br-offSecLbl') else None
old_price = product.css_first('.br-standardPriceDemoted').text().strip() if product.css_first('.br-standardPriceDemoted') else None
shipping_text = raw_shipping.text().strip() if raw_shipping else ''
shipping = shipping_text if 'shipping' in shipping_text else None
rating_text = raw_rating.attributes.get('aria-label', '') if raw_rating else None
reviews_text = raw_rating.text().strip() if raw_rating else None
reviews = reviews_text.replace('(', '').replace(')', '') if reviews_text else None
thumbnail = product.css_first('.cico img').attributes.get('src', None) if product.css_first('.cico img') else None
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر نیاز به دریافت یک مقدار خاص دارید، می توانید از عبارت منظم برای استخراج آنها استفاده کنید:

# https://regex101.com/r/lap8lr/1
extracted_price = float(re.search(r'[\d|,|.]+', price).group().replace(',', ''))
# https://regex101.com/r/D2YTRI/1
rating = float(re.search(r'[\d.\d|\d]+', rating_text).group(0)) if rating_text else None
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در پایان هر تکرار، داده های محصول به آن اضافه می شود data لیست:

data.append({
    'position': position,
    'title': title,
    'product_link': product_link,
    'brand': brand,
    'seller': seller,
    'price': price,
    'extracted_price': extracted_price,
    'old_price': old_price,
    'shipping': shipping,
    'rating': rating,
    'reviews': reviews,
    'thumbnail': thumbnail
})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از انجام تمام عملیات، آن را برگردانید data لیست:

return data
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تابع به شکل زیر است:

def get_inline_shopping_results(parser: LexborHTMLParser, product_counter: int) -> list:
    data = []

    for position, product in enumerate(parser.root.css('.br-gOffCard'), start=product_counter):
        raw_title = product.css_first('.br-offTtl span')
        raw_shipping = product.css_first('.br-offDec')
        raw_rating = product.css_first('.tags > span')

        title = raw_title.attributes.get('title', '') if raw_title else product.css_first('.br-offTtl').text().strip()
        product_link = product.css_first('.br-offLink').attributes.get('href', '')
        brand = product.css_first('.br-offSecLbl').text().strip() if product.css_first('.br-offSecLbl') else None
        seller = product.css_first('.br-offSlr').text().strip()
        price = product.css_first('.br-price').text().strip()
        # https://regex101.com/r/lap8lr/1
        extracted_price = float(re.search(r'[\d|,|.]+', price).group().replace(',', ''))
        old_price = product.css_first('.br-standardPriceDemoted').text().strip() if product.css_first('.br-standardPriceDemoted') else None
        shipping_text = raw_shipping.text().strip() if raw_shipping else ''
        shipping = shipping_text if 'shipping' in shipping_text else None
        rating_text = raw_rating.attributes.get('aria-label', '') if raw_rating else None
        # https://regex101.com/r/D2YTRI/1
        rating = float(re.search(r'[\d.\d|\d]+', rating_text).group(0)) if rating_text else None
        reviews_text = raw_rating.text().strip() if raw_rating else None
        reviews = reviews_text.replace('(', '').replace(')', '') if reviews_text else None
        thumbnail = product.css_first('.cico img').attributes.get('src', None) if product.css_first('.cico img') else None

        data.append({
            'position': position,
            'title': title,
            'product_link': product_link,
            'brand': brand,
            'seller': seller,
            'price': price,
            'extracted_price': extracted_price,
            'old_price': old_price,
            'shipping': shipping,
            'rating': rating,
            'reviews': reviews,
            'thumbnail': thumbnail
        })

    return data
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتایج خرید را دریافت کنید

تابع a را می گیرد parser و الف product_counter. لیستی را با داده های بازیابی شده برمی گرداند.

را data لیستی اعلام می شود که داده های استخراج شده به آن اضافه می شود:

data = []
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در تابع قبلی، فرآیند استخراج داده ها به تفصیل شرح داده شد. در این تابع، فرآیند بسیار مشابه است به جز برای داده های مختلف و انتخابگرهای متفاوت:

for position, product in enumerate(parser.root.css('.br-fullCard'), start=product_counter):
    raw_title = product.css_first('.br-title span')

    title = raw_title.attributes.get('title', '') if raw_title else product.css_first('.br-title').text().strip()
    product_link = f"https://www.bing.com{product.css_first('.br-titlelink').attributes.get('href', '')}"
    seller = product.css_first('.br-seller').text().strip()
    price = product.css_first('.pd-price').text().strip()
    # https://regex101.com/r/lap8lr/1
    extracted_price = float(re.search(r'[\d|,|.]+', price).group().replace(',', ''))
    sale = True if product.css_first('.br-saletag') else False
    old_price = product.css_first('.br-pdOfferPrice').text().strip() if product.css_first('.br-pdOfferPrice') else None
    shipping = product.css_first('.br-decoSlot').text().strip() if product.css_first('.br-decoSlot') else None
    thumbnail = product.css_first('.br-pdMainImg img').attributes.get('src', None) if product.css_first('.br-pdMainImg img') else None
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در پایان هر تکرار، داده های محصول به آن اضافه می شود data لیست:

data.append({
    'position': position,
    'title': title,
    'product_link': product_link,
    'seller': seller,
    'price': price,
    'extracted_price': extracted_price,
    'sale': sale,
    'old_price': old_price,
    'shipping': shipping,
    'thumbnail': thumbnail
})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از انجام تمام عملیات، آن را برگردانید data لیست:

return data
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تابع به شکل زیر است:

def get_shopping_results(parser: LexborHTMLParser, product_counter: int) -> list:
    data = []

    for position, product in enumerate(parser.root.css('.br-fullCard'), start=product_counter):
        raw_title = product.css_first('.br-title span')

        title = raw_title.attributes.get('title', '') if raw_title else product.css_first('.br-title').text().strip()
        product_link = f"https://www.bing.com{product.css_first('.br-titlelink').attributes.get('href', '')}"
        seller = product.css_first('.br-seller').text().strip()
        price = product.css_first('.pd-price').text().strip()
        # https://regex101.com/r/lap8lr/1
        extracted_price = float(re.search(r'[\d|,|.]+', price).group().replace(',', ''))
        sale = True if product.css_first('.br-saletag') else False
        old_price = product.css_first('.br-pdOfferPrice').text().strip() if product.css_first('.br-pdOfferPrice') else None
        shipping = product.css_first('.br-decoSlot').text().strip() if product.css_first('.br-decoSlot') else None
        thumbnail = product.css_first('.br-pdMainImg img').attributes.get('src', None) if product.css_first('.br-pdMainImg img') else None

        data.append({
            'position': position,
            'title': title,
            'product_link': product_link,
            'seller': seller,
            'price': price,
            'extracted_price': extracted_price,
            'sale': sale,
            'old_price': old_price,
            'shipping': shipping,
            'thumbnail': thumbnail
        })

    return data
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

{
  "inline_shopping_results": [
    {
      "position": 1,
      "title": "Sony Playstation 4 Dual Shock 4 Controller",
      "product_link": "https://www.bing.com/aclick?ld=e8y8UnkNEA5yLnmFwFXVJsIDVUCUxGDjCRfBB7hezInXrQF_5sOcYbnlwQ7FroV_Zn5FefQcj7dQqTSlvA3lj2I21y0MviXMAVnyW-3FkoUoi16_LPCXsLblfhhQ2D_DBXPc7yCF56HaNeXUDrxLymGBGLDEWL241igNH5h1ZNrEBK3Hy1&u=aHR0cHMlM2ElMmYlMmZ3d3cuYW1hem9uLmNvbSUyZlNvbnktUGxheVN0YXRpb24tRHVhbHNob2NrLVdpcmVsZXNzLUNvbnRyb2xsZXItQmxhY2slMmZkcCUyZkIwMEQ4Mlo0WU8lMmZyZWYlM2Rhc2NfZGZfQjAwRDgyWjRZTyUzZnRhZyUzZGJpbmdzaG9wcGluZ2EtMjAlMjZsaW5rQ29kZSUzZGRmMCUyNmh2YWRpZCUzZDc5OTg5NTk3MTQ0NTE1JTI2aHZuZXR3JTNkbyUyNmh2cW10JTNkZSUyNmh2Ym10JTNkYmUlMjZodmRldiUzZGMlMjZodmxvY2ludCUzZCUyNmh2bG9jcGh5JTNkJTI2aHZ0YXJnaWQlM2RwbGEtNDU4MzU4OTExODI4NTM1MCUyNnBzYyUzZDE&rlid=044e0ea8d1d91e49a33a6a95b021d2b3",
      "brand": "580+ viewed",
      "seller": "Amazon.com",
      "price": "$56.00",
      "extracted_price": 56.0,
      "old_price": null,
      "shipping": null,
      "rating": 4.5,
      "reviews": null,
      "thumbnail": "https://th.bing.com/th?id=OP.javWvhvskVjF3A474C474&w=140&h=140&pid=21.1"
    },
    {
      "position": 2,
      "title": "Wireless Controller For PS4/Slim/Pro, Berry Blue",
      "product_link": "https://www.bing.com/aclick?ld=e8K5Qjv1rx7b91q1TGu2kIHDVUCUzljX6PIJ1_Ag71Iy5QZiGWnbe49xj4OnlDYYwXIZtyHeZHN66fGgfhttXqkZjtRPPAG3TZF7rGH0z6XerddgQBQx_dfYoJlYMoPPnC1ujLoNsFoUL6VTMyu4Ln14u3EoPqCJV8wSvMZ7FHfLWcEayH&u=aHR0cHMlM2ElMmYlMmZjbGlja3NlcnZlLmRhcnRzZWFyY2gubmV0JTJmbGluayUyZmNsaWNrJTNmJTI2JTI2ZHNfZV9hZGlkJTNkNzUzMTY2OTg4MTk5MTglMjZkc19lX3RhcmdldF9pZCUzZHBsYS00NTc4OTE2MjM5MDc0Njc5JTI2ZHNfZV9wcm9kdWN0X2dyb3VwX2lkJTNkNDU3ODkxNjIzOTA3NDY3OSUyNmRzX2VfcHJvZHVjdF9pZCUzZDEzOTY2MDA3OV8xMDAwMTEzNTk4OCUyNmRzX2VfcHJvZHVjdF9jb3VudHJ5JTNkVVMlMjZkc19lX3Byb2R1Y3RfbGFuZ3VhZ2UlM2RFTiUyNmRzX2VfcHJvZHVjdF9jaGFubmVsJTNkT25saW5lJTI2ZHNfdXJsX3YlM2QyJTI2ZHNfZGVzdF91cmwlM2RodHRwcyUzYSUyZiUyZnd3dy53YWxtYXJ0LmNvbSUyZmlwJTJmV2lyZWxlc3MtQ29udHJvbGxlci1mb3ItUFM0LVNsaW0tUHJvLUJlcnJ5LUJsdWUlMmYxMzk2NjAwNzklM2Z3bWxzcGFydG5lciUzZHdscGElMjZzZWxlY3RlZFNlbGxlcklkJTNkMTAxMTE2NjI2JTI2YWRpZCUzZDIyMjIyMjIyMjIyNTc2ODA1MzgwJTI2d21sc3BhcnRuZXIlM2R3bXRsYWJzJTI2d2wwJTNkZSUyNndsMSUzZG8lMjZ3bDIlM2RjJTI2d2wzJTNkNzUzMTY2OTg4MTk5MTglMjZ3bDQlM2RwbGEtNDU3ODkxNjIzOTA3NDY3OSUyNndsNSUzZCUyNndsNiUzZCUyNndsNyUzZCUyNndsMTAlM2RXYWxtYXJ0JTI2d2wxMSUzZE9ubGluZSUyNndsMTIlM2QxMzk2NjAwNzlfMTAwMDExMzU5ODglMjZ3bDE0JTNkcHM0JTI1MjBjb250cm9sbGVyJTI2dmVoJTNkc2VtJTI2Z2NsaWQlM2Q1NjkxZjc3M2I3ODQxMTQ2ZTVhYjkzNGVkNjdjNTQ0OSUyNmdjbHNyYyUzZDNwLmRzJTI2bXNjbGtpZCUzZDU2OTFmNzczYjc4NDExNDZlNWFiOTM0ZWQ2N2M1NDQ5&rlid=5691f773b7841146e5ab934ed67c5449",
      "brand": "Brand: SPBPQY",
      "seller": "Walmart",
      "price": "$19.99",
      "extracted_price": 19.99,
      "old_price": null,
      "shipping": "Free shipping",
      "rating": null,
      "reviews": null,
      "thumbnail": "https://th.bing.com/th?id=OP.AjeAqUx49FCBaQ474C474&w=140&h=140&pid=21.1"
    },
    {
      "position": 3,
      "title": "YCCTEAM Wireless Ps4 Controller ,Wireless Game Controller Compatible With Playstation 4/Slim/Pro, Built-In 1000Mah Battery With Turbo/Dual Vibration",
      "product_link": "https://www.bing.com/aclick?ld=e8XOuCV1B-F1vb3cgxnxYFWjVUCUxeNZ_G0jSncEe8IzWF8UzLDZihTUvXFtS_U7DFDfJNV_L4aBCyLLwDxIW3jnYGUaW0Q0C4MhhYByxkPdaXmHEexgmFgmfKA1EITFmoVR4_Yla_FXAV-Nmx6yJiQmPLtRwNLSr6eWXTZE07O-ZjlAPX&u=aHR0cHMlM2ElMmYlMmZ3d3cuYW1hem9uLmNvbSUyZkNvbnRyb2xsZXItQ2hhcmdpbmctWUNDVEVBTS1JbmRpY2F0b3ItSm95c3RpY2tzJTJmZHAlMmZCMDdXN0gyMVZWJTJmcmVmJTNkYXNjX2RmX0IwN1c3SDIxVlYlM2Z0YWclM2RiaW5nc2hvcHBpbmdhLTIwJTI2bGlua0NvZGUlM2RkZjAlMjZodmFkaWQlM2Q3OTg1MjEyNDE1MTUzNSUyNmh2bmV0dyUzZG8lMjZodnFtdCUzZGUlMjZodmJtdCUzZGJlJTI2aHZkZXYlM2RjJTI2aHZsb2NpbnQlM2QlMjZodmxvY3BoeSUzZCUyNmh2dGFyZ2lkJTNkcGxhLTQ1ODM0NTE2NjkzOTg1NzklMjZwc2MlM2Qx&rlid=15ad8be3c1af10f584ffefdea057bbd8",
      "brand": null,
      "seller": "Amazon.com",
      "price": "$19.99",
      "extracted_price": 19.99,
      "old_price": null,
      "shipping": null,
      "rating": null,
      "reviews": null,
      "thumbnail": "https://th.bing.com/th?id=OP.NsyWoG%2bGBv4G3A474C474&w=140&h=140&pid=21.1"
    },
    ... other inline shopping results
  ],
  "shopping_results": [
    {
      "position": 1,
      "title": "Sony PS4 Dualshock 4 Wireless Controller - Midnight Blue",
      "product_link": "https://www.bing.com/shop/productpage?q=ps4+controller&filters=scenario%3a%2217%22+gType%3a%223%22+gId%3a%22IKQSlWYtjMJCH45YKbCW1INZT5%22+gIdHash%3a%221034604334%22+gGlobalOfferIds%3a%2297596786905%22+AucContextGuid%3a%220%22+GroupEntityId%3a%22IKQSlWYtjMJCH45YKbCW1INZT5%22+NonSponsoredOffer%3a%22True%22&productpage=true&FORM=SHPPDP&browse=true",
      "seller": "Walmart",
      "price": "$64.00",
      "extracted_price": 64.0,
      "sale": false,
      "old_price": null,
      "shipping": "Free shipping",
      "thumbnail": "https://th.bing.com/th?id=OP.5KY3rYxghNq1ng474C474&w=272&h=272&o=5&pid=21.1"
    },
    {
      "position": 2,
      "title": "Sony Dual Shock 4 Bluetooth Controller For PS4 - Black",
      "product_link": "https://www.bing.com/shop/productpage?q=ps4+controller&filters=scenario%3a%2217%22+gType%3a%223%22+gId%3a%22IjzPcGXIjh5kEfHzF4DdKkdm7O%22+gIdHash%3a%22503285226%22+gGlobalOfferIds%3a%2213378540660%22+AucContextGuid%3a%220%22+GroupEntityId%3a%22IjzPcGXIjh5kEfHzF4DdKkdm7O%22+NonSponsoredOffer%3a%22True%22&productpage=true&FORM=SHPPDP&browse=true",
      "seller": "Tech Import World",
      "price": "$51.92",
      "extracted_price": 51.92,
      "sale": false,
      "old_price": null,
      "shipping": null,
      "thumbnail": "https://th.bing.com/th?id=OP.2zrQISY7yRggYA474C474&w=272&h=272&o=5&pid=21.1"
    },
    {
      "position": 3,
      "title": "Sony PS4 Dualshock 4 Wireless Controller - Green Camouflage",
      "product_link": "https://www.bing.com/shop/productpage?q=ps4+controller&filters=scenario%3a%2217%22+gType%3a%223%22+gId%3a%22IsUwpe7StYMy9zWBEooypnccb6%22+gIdHash%3a%221451490157%22+gGlobalOfferIds%3a%2285554586355%22+AucContextGuid%3a%220%22+GroupEntityId%3a%22IsUwpe7StYMy9zWBEooypnccb6%22+NonSponsoredOffer%3a%22True%22&productpage=true&FORM=SHPPDP&browse=true",
      "seller": "Walmart",
      "price": "$64.00",
      "extracted_price": 64.0,
      "sale": false,
      "old_price": null,
      "shipping": "Free shipping",
      "thumbnail": "https://th.bing.com/th?id=OP.bmIHvaU977kYvw474C474&w=272&h=272&o=5&pid=21.1"
    },
    ... other shopping results
  ]
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به ما بپیوندید در توییتر | یوتیوب

یک درخواست ویژگی💫 یا یک اشکال🐞 اضافه کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا