如何从Shopify Python API获取所有产品ID

时间:2017-04-23 19:37:32

标签: python-2.7 api shopify

我创建了一个私人shopify应用。哪个可以获得产品ID的几乎所有信息。但我需要一个选项来获取所有产品的产品ID,并使用API​​。我试过了下面的选项

shopify.Product.find()

但它只展示了前50种产品。但我的商店有超过2.4k的产品。

4 个答案:

答案 0 :(得分:15)

Shopify返回资源列表的分页响应。每页的默认资源数为50,默认页面为1。因此,您的请求等同于以下内容:

shopify.Product.find(limit=50, page=1)

Shopify允许您将每页的限制增加到250.这是我用来获取所有给定资源的辅助函数:

def get_all_resources(resource, **kwargs):
    resource_count = resource.count(**kwargs)
    resources = []
    if resource_count > 0:
        for page in range(1, ((resource_count-1) // 250) + 2):
            kwargs.update({"limit" : 250, "page" : page})
            resources.extend(resource.find(**kwargs))
    return resources

你这样使用它:

products = get_all_resources(shopify.Product)

您甚至可以传递参数。您的问题专门针对产品ID提出问题 - 如果您将查询限制为仅返回ID,则会更快,更快(因为它不需要提取任何产品变体):

product_ids = get_all_resources(shopify.Product, fields="id")

请注意,如果您有2.4k产品,这可能需要一些时间!

文档: https://help.shopify.com/api/reference/product

答案 1 :(得分:3)

Shopify API 中的分页界面已更改,旧的“限制 + 页面”分页方式为 removed in api version 2019-07

换句话说:@Julien 接受的答案不适用于此 api 版本及更高版本。

我在这里使用新的relative cursor based pagination方式重新创建了已接受答案的函数:

<style src="main.css"></style>

答案 2 :(得分:1)

Lennart Rolland 回应的延伸。

正如他所说,首选答案不再适用于 2019-07 api 版本。

我无法让他的代码示例工作,因为错误“列表没有函数 has_next_page()”。

所以我编写了一个使用“Link”标头 rel='next' 分页的示例。

def get_all_resources(resource):
    page_info = str()
    resources = list()
    while True:
        resources.extend(resource.find(limit=250, page_info=page_info))
        cursor = shopify.ShopifyResource.connection.response.headers.get('Link')
        if 'next' in cursor:
            page_info = cursor.split(';')[-2].strip('<>').split('page_info=')[1]
        else:
            break
    return resources

答案 3 :(得分:0)

这也可能会有所帮助:

def get_products():
    """
    Returns a list of all products in form of response JSON
    from Shopify API endpoint connected to storefront.

    * Note: Shopify API allows 250 pruducts per call.

    :return:
        product_list (list):    List containing all product response
                                JSONs from Shopify API.
    """

    products = []
    is_remaining = True
    i = 1
    while is_remaining:

        if i == 1:
            params = {
                "limit": 250,
                "page": i
            }

            response = requests.get(
                "{}/products.json".format(SHOPIFY_ENDPOINT),
                params=params
            )

            products.append(response.json()['products'])
            i += 1

        elif len(products[i-2]) % 250 == 0:
            params = {
                "limit": 250,
                "page": i
            }

            response = requests.get(
                "{}/products.json".format(SHOPIFY_ENDPOINT),
                params=params
            )

            products.append(response.json()['products'])
            i += 1

        else:
            is_remaining = False

    products = [products[i][j]
        for i in range(0, len(products))
        for j in range(0, len(products[i]))
    ]

    return products