> For the complete documentation index, see [llms.txt](https://developers.oxylabs.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developers.oxylabs.io/api-targets/cn/e-commerce/etsy.md).

# Etsy

了解如何开始抓取 Etsy。

使用网页爬虫API，你可以抓取并解析各种类型的 **Etsy** 页面；以下是所有受支持抓取器及其对应的 `来源` 值。

| 来源             | 说明                                                                                                                                                           | 专用解析器                                                        |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ |
| `etsy_search`  | [**搜索页**](https://app.gitbook.com/o/YFRJGnXcbhIMTe1cuCmz/s/zrXw45naRpCZ0Ku9AjY1/~/changes/816/scraper-apis/web-scraper-api/amazon-1/best-buy) 用于你选择的搜索词。     | 否。                                                           |
| `etsy_product` | [**商品页** ](https://app.gitbook.com/o/YFRJGnXcbhIMTe1cuCmz/s/zrXw45naRpCZ0Ku9AjY1/~/changes/816/scraper-apis/web-scraper-api/amazon-1/best-buy-1)用于你选择的商品 ID。 | 是。                                                           |
| `etsy`         | 提交任意 Etsy [**URL**](/api-targets/cn/e-commerce/etsy/url.md) 都可以。                                                                                             | 仅限 [Etsy 商品](/api-targets/cn/e-commerce/etsy/product.md) 页面。 |

## 入门

**创建你的 API 用户凭证**：注册免费试用，或在 [**Oxylabs 控制台**](https://dashboard.oxylabs.io/en/registration) 中购买该产品，以创建你的 API 用户凭证（`USERNAME` 和 `PASSWORD`).

{% hint style="warning" %}
如果你的账号需要多个 API 用户，请联系我们的 [**客户支持**](mailto:support@oxylabs.io) 或通过我们的全天候在线聊天支持联系。
{% endhint %}

### 请求示例

{% tabs %}
{% tab title="cURL" %}

```bash
curl 'https://realtime.oxylabs.io/v1/queries' \\
--user "USERNAME:PASSWORD" \\
-H "Content-Type: application/json" \\
-d '{
        "source": "etsy_product",
        "product_id": "1858266469",
        "parse": true
    }'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
from pprint import pprint

# Structure payload.
payload = {
    'source': 'etsy_product',
    'product_id': '1858266469',
    'parse': True
}

# Get response.
response = requests.request(
    'POST',
    'https://realtime.oxylabs.io/v1/queries',
    auth=('USERNAME', 'PASSWORD'),
    json=payload,
)

# Print prettified response to stdout.
pprint(response.json())
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const https = require("https");

const username = "USERNAME";
const password = "PASSWORD";
const body = {
    source: "etsy_product",
    product_id: "1858266469",
    parse: true,
};

const options = {
    hostname: "realtime.oxylabs.io",
    path: "/v1/queries",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        Authorization:
            "Basic " + Buffer.from(`${username}:${password}`).toString("base64"),
    },
};

const request = https.request(options, (response) => {
    let data = "";

    response.on("data", (chunk) => {
        data += chunk;
    });

    response.on("end", () => {
        const responseData = JSON.parse(data);
        console.log(JSON.stringify(responseData, null, 2));
    });
});

request.on("error", (error) => {
    console.error("Error:", error);
});

request.write(JSON.stringify(body));
request.end();
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$params = array(
    'source' => 'etsy_product',
    'product_id' => '1858266469',
    'parse' => true,
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://realtime.oxylabs.io/v1/queries");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_USERPWD, "USERNAME" . ":" . "PASSWORD");

$headers = array();
$headers[] = "Content-Type: application/json";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
echo $result;

if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);
?>
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;

namespace OxyApi
{
    class Program
    {
        static async Task Main()
        {
            const string Username = "USERNAME";
            const string Password = "PASSWORD";

            var parameters = {
                source = "etsy_product",
                product_id = "1858266469",
                parse = true
            };

            var client = new HttpClient();

            Uri baseUri = new Uri("https://realtime.oxylabs.io");
            client.BaseAddress = baseUri;

            var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/v1/queries");
            requestMessage.Content = JsonContent.Create(parameters);

            var authenticationString = $"{Username}:{Password}";
            var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(authenticationString));
            requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);

            var response = await client.SendAsync(requestMessage);
            var contents = await response.Content.ReadAsStringAsync();

            Console.WriteLine(contents);
        }
    }
}
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	const Username = "USERNAME"
	const Password = "PASSWORD"

	payload := map[string]interface{}{
		"source":       "etsy_product",
		"query":        "1858266469",
		"parse":        true,
	}

	jsonValue, _ := json.Marshal(payload)

	client := &http.Client{}
	request, _ := http.NewRequest("POST",
		"https://realtime.oxylabs.io/v1/queries",
		bytes.NewBuffer(jsonValue),
	)

	request.SetBasicAuth(Username, Password)
	request.Header.Set("Content-Type", "application/json")
	response, _ := client.Do(request)

	responseText, _ := ioutil.ReadAll(response.Body)
	fmt.Println(string(responseText))
}
```

{% endtab %}

{% tab title="HTTP" %}

```http
https://realtime.oxylabs.io/v1/queries?source=etsy_product&product_id=1858266469&parse=true&access_token=12345abcde
```

{% endtab %}

{% tab title="Java" %}

```java
package org.example;

import okhttp3.*;
import org.json.JSONObject;
import java.util.concurrent.TimeUnit;

public class Main implements Runnable {
    private static final String AUTHORIZATION_HEADER = "Authorization";
    public static final String USERNAME = "USERNAME";
    public static final String PASSWORD = "PASSWORD";

    public void run() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("source", "etsy_product");
        jsonObject.put("product_id", "1858266469");
        jsonObject.put("parse", true);

        Authenticator authenticator = (route, response) -> {
            String credential = Credentials.basic(USERNAME, PASSWORD);
            return response
                    .request()
                    .newBuilder()
                    .header(AUTHORIZATION_HEADER, credential)
                    .build();
        };

        var client = new OkHttpClient.Builder()
                .authenticator(authenticator)
                .readTimeout(180, TimeUnit.SECONDS)
                .build();

        var mediaType = MediaType.parse("application/json; charset=utf-8");
        var body = RequestBody.create(jsonObject.toString(), mediaType);
        var request = new Request.Builder()
                .url("https://realtime.oxylabs.io/v1/queries")
                .post(body)
                .build();

        try (var response = client.newCall(request).execute()) {
            if (response.body() != null) {
                try (var responseBody = response.body()) {
                    System.out.println(responseBody.string());
                }
            }
        } catch (Exception exception) {
            System.out.println("Error: " + exception.getMessage());
        }

        System.exit(0);
    }

    public static void main(String[] args) {
        new Thread(new Main()).start();
    }
}
```

{% endtab %}

{% tab title="JSON" %}

```json
{
    "source": "etsy_product",
    "product_id": "1858266469",
    "parse": true
}
```

{% endtab %}
{% endtabs %}

<details>

<summary>输出示例</summary>

```json
{
    "results": [
        {
            "content": {
                "avg_price": 37.33,
                "categories": [
                    {
                        "title": "Homepage"
                    },
                    ...
                ],
                "currency": "USD",
                "customized": false,
                "images": [
                    "https://i.etsystatic.com/55594479/r/il/8c24e4/6566024892/il_75x75.6566024892_rdzf.jpg",
                    ...
                ],
                "max_price": 40,
                "min_price": 32,
                "old_price": 40,
                "parse_status_code": 12000,
                "price": 32,
                "product_id": "1858266469",
                "seller": {
                    "best_seller": false,
                    "rating": 4.71,
                    "star_seller": false,
                    "title": "Divanjewelrygold",
                    "url": "https://www.etsy.com/shop/Divanjewelrygold?ref=shop-header-name&listing_id=1858266469&from_page=listing"
                },
                "shipping": {
                    "from": "North Bergen, NJ"
                },
                "title": "Freshwater Pearl Drop Earrings,Bridal Pearl Earrings,18K Gold Dangle Earrings,Wedding Earrings,Bridesmaid Gift,Wedding Gift,Bridal Jewelry",
                "url": "https://www.etsy.com/listing/1858266469/freshwater-pearl-drop-earringsbridal",
                "variation_count": 3
            },
            "created_at": "2026-09-18 06:53:27",
            "updated_at": "2026-09-18 06:53:33",
            "page": 1,
            "url": "https://www.etsy.com/listing/1858266469/freshwater-pearl-drop-earringsbridal",
            "job_id": "7506606300562727937",
            "is_render_forced": true,
            "status_code": 200,
            "parser_type": "etsy_product",
            "parser_preset": null
        }
    ]
}
```

</details>

我们在示例中使用同步 [**Realtime**](/products/cn/web-scraper-api/integration-methods/realtime.md) 集成方式。如果你想使用 [**Proxy Endpoint**](/products/cn/web-scraper-api/integration-methods/proxy-endpoint.md) 或异步 [**Push-Pull**](/products/cn/web-scraper-api/integration-methods/push-pull.md) 集成，请参阅 [**集成方法**](/products/cn/web-scraper-api/integration-methods.md) 部分。

你也可以选择添加其他参数，例如`user_agent_type`, `parse`, `render` 等，以自定义你的抓取请求。了解更多：

{% content-ref url="/spaces/ZwEHB9k4MH4pDy80n9mF/pages/1c0708575f299a0b7d4cba7684877a9277872b1e" %}
[功能](/products/cn/web-scraper-api/features.md)
{% endcontent-ref %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://developers.oxylabs.io/api-targets/cn/e-commerce/etsy.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
