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

چه چیزی تراشیده خواهد شد
📌توجه: نتایج خرید درون خطی ممکن است همیشه وجود نداشته باشد.
کد کامل
اگر نیازی به توضیح ندارید، به نمونه کد کامل در 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
]
}
پیوندها
به ما بپیوندید در توییتر | یوتیوب
یک درخواست ویژگی💫 یا یک اشکال🐞 اضافه کنید