Go SDK
概述
官方 Scrapeless Go SDK 提供对浏览器自动化、抓取、爬取、代理、搜索结果以及 AI 聊天内容提取的访问能力。本指南遵循 SDK 仓库 README,包含可运行的示例和配置详情。
环境要求
仓库的 go.mod 要求使用 Go 1.24.0 或更高版本。请在 Go module 内运行安装命令。对于新项目,可使用 go mod init example.com/scrapeless-demo 初始化一个 module。
安装
go get -u github.com/scrapeless-ai/sdk-go身份认证 / API Key
登录 Scrapeless 控制台 并创建一个 API key。在运行示例前将其导出:
export SCRAPELESS_API_KEY="YOUR_API_KEY"请将 API key 保存在环境变量或密钥管理器中,而不要将其提交到源代码管理系统。
快速开始
将以下内容保存为 main.go,在设置好 API key 后运行 go run .。使用相应的 With...() 选项启用各项服务,并在完成后关闭客户端。
package main
import (
"context"
"fmt"
"log"
"github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/universal"
)
func main() {
client := scrapeless.New(scrapeless.WithUniversal())
defer client.Close()
result, err := client.Universal.CreateTask(context.Background(), universal.UniversalTaskRequest{
Actor: universal.ScraperUniversal,
Input: map[string]any{
"url": "https://example.com",
"method": "GET",
"redirect": false,
},
})
if err != nil {
log.Print(err)
return
}
fmt.Printf("%+v\n", result)
}产品覆盖对照表
| 产品 | SDK 服务 | 启用方式 | 覆盖范围 |
|---|---|---|---|
| Agent Browser | client.Browser | scrapeless.WithBrowser() | 创建并管理远程浏览器会话。 |
| Browser Profiles | client.Profile | scrapeless.WithProfile() | 跨会话持久化浏览器数据。 |
| Scraping API | client.Scraping | scrapeless.WithScraping() | 使用网站 actor 提取结构化数据。 |
| Web Unlocker | client.Universal | scrapeless.WithUniversal() | 从受保护的网站获取内容。 |
| Crawl | client.Crawl | scrapeless.WithCrawl() | 抓取单个页面或爬取整个网站。 |
| Google Search API | client.DeepSerp | scrapeless.WithDeepSerp() | 提取搜索引擎结果。 |
| Proxies | client.Proxy | scrapeless.WithProxy() | 生成代理连接 URL。 |
| AI Scraper | client.AIScraper | scrapeless.WithAIScraper() | 创建 AI 聊天任务并获取其状态和结果。 |
各项服务均为按需启用。例如,使用 scrapeless.New(scrapeless.WithBrowser(), scrapeless.WithAIScraper()) 可同时初始化浏览器和 AI Scraper 支持。README 中还记录了用于其他工作流的 Client.Captcha、Client.Server 和 Client.Router。
使用示例
Browser
package main
import (
"context"
"github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/log"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/browser"
)
func main() {
client := scrapeless.New(scrapeless.WithBrowser())
defer client.Close()
browserInfo, err := client.Browser.Create(context.Background(), browser.Actor{
Input: browser.Input{SessionTtl: "180"},
ProxyCountry: "US",
})
if err != nil {
panic(err)
}
log.Infof("%+v", browserInfo)
}Browser Profile
package main
import (
"context"
"fmt"
"github.com/scrapeless-ai/sdk-go/scrapeless"
)
func main() {
client := scrapeless.New(scrapeless.WithProfile())
defer client.Close()
result, err := client.Profile.CreateProfile(context.Background(), "My Profile")
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", result)
}Scraping API
package main
import (
"context"
"github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/log"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/scraping"
)
func main() {
client := scrapeless.New(scrapeless.WithScraping())
defer client.Close()
scrape, err := client.Scraping.Scrape(context.Background(), scraping.ScrapingTaskRequest{
Actor: "scraper.google.search",
Input: map[string]interface{}{
"q": "nike site:www.nike.com",
},
ProxyCountry: "US",
})
if err != nil {
log.Errorf("scraping create err:%v", err)
return
}
log.Infof("%+v", scrape)
}Web Unlocker
使用 Web Unlocker(以 client.Universal 形式暴露)从网站提取数据。
package main
import (
"context"
"fmt"
"github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/universal"
)
func main() {
client := scrapeless.New(scrapeless.WithUniversal())
defer client.Close()
result, err := client.Universal.CreateTask(context.Background(), universal.UniversalTaskRequest{
Actor: universal.ScraperUniversal,
Input: map[string]any{
"url": "https://example.com",
"method": "GET",
"redirect": false,
},
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", result)
}Crawl
package main
import (
"context"
"github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/log"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/crawl"
)
func main() {
client := scrapeless.New(scrapeless.WithCrawl())
defer client.Close()
// Crawl
response, err := client.Crawl.CrawlUrl(context.Background(), "https://redditinc.com/blog", crawl.CrawlParams{
Limit: 10,
ScrapeOptions: crawl.ScrapeOptions{
Formats: []string{"links",
"markdown",
"html",
"screenshot"},
},
BrowserOptions: crawl.ICreateBrowser{
SessionName: "Crawl",
SessionTTL: "900",
SessionRecording: "true",
ProxyCountry: "ANY",
},
})
if err != nil {
panic(err)
}
log.Infof("Crawl response: %v", response)
// scrape
scrapeResponse, err := client.Crawl.ScrapeUrl(context.Background(), "https://docs.scrapeless.com/en/docs/get-started/overview/", crawl.ScrapeOptions{
BrowserOptions: crawl.ICreateBrowser{
SessionName: "Crawl",
SessionTTL: "900",
SessionRecording: "true",
ProxyCountry: "ANY",
},
})
if err != nil {
panic(err)
}
log.Infof("Scrape response: %v", scrapeResponse)
}Proxy
package main
import (
"context"
"fmt"
"github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/proxies"
)
func main() {
client := scrapeless.New(scrapeless.WithProxy())
defer client.Close()
result, err := client.Proxy.Proxy(context.Background(), proxies.ProxyActor{
Country: "US",
SessionDuration: 30,
SessionId: "my-session",
Gateway: "your-proxy-gateway:port",
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", result)
}AI Scraper
批量提取 AI 聊天内容,以监测品牌提及、对比回答,并从最新模型中分析竞争情报。通过一次集成即可获取 URL、prompt、Markdown 格式回答、引用来源等信息。
支持的 actor 包括 scraper.chatgpt、scraper.perplexity、scraper.copilot、scraper.gemini、scraper.aimode、scraper.overview、scraper.grok 和 scraper.alexa。input JSON 取决于所选 actor;有关详细参数,请参阅 AI Scraper 文档。可选的 webhook JSON 包含一个回调 url。
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/aiscraper"
)
func main() {
client := scrapeless.New(scrapeless.WithAIScraper()) // Uses SCRAPELESS_API_KEY
defer client.Close()
ctx := context.Background()
task, err := client.AIScraper.CreateTask(ctx, aiscraper.TaskRequest{
Actor: "scraper.chatgpt",
Input: map[string]any{
"prompt": "Most reliable proxy service for data extraction",
"country": "US",
"web_search": true,
},
// Optional: Webhook: map[string]any{"url": "https://your-webhook.example.com"},
})
if err != nil {
panic(err)
}
fmt.Println("Created task:", string(task))
var created struct {
TaskID string `json:"task_id"`
}
if err := json.Unmarshal(task, &created); err != nil {
panic(err)
}
result, err := client.AIScraper.GetTaskResult(ctx, created.TaskID)
if err != nil {
panic(err)
}
fmt.Println("Task status and result:", string(result))
// If status is "running", call GetTaskResult again later.
// If status is "failed", message contains the failure reason.
}这两个方法都会原样返回 API 的 JSON。创建操作会返回 task_id、status,并在可用时返回 task_result。结果获取操作会返回 status、可用时的 task_result,以及失败时的 message。状态为 success、failed 或 running;SDK 不会自动轮询。
响应为原始 JSON 字节([]byte),保留了所有 API 字段。可按需使用 encoding/json 对其进行解码。
Google Search API
package main
import (
"context"
scrapeless "github.com/scrapeless-ai/sdk-go/scrapeless"
"github.com/scrapeless-ai/sdk-go/scrapeless/log"
"github.com/scrapeless-ai/sdk-go/scrapeless/services/deepserp"
)
func main() {
client := scrapeless.New(scrapeless.WithDeepSerp())
defer client.Close()
scrape, err := client.DeepSerp.Scrape(context.Background(), deepserp.DeepserpTaskRequest{
Actor: "scraper.google.search",
Input: map[string]interface{}{
"q": "nike site:www.nike.com",
},
ProxyCountry: "US",
})
if err != nil {
log.Errorf("scraping create err:%v", err)
return
}
log.Infof("%+v", scrape)
}如需更完整的集成示例,请浏览仓库的示例目录。
错误处理
在使用服务响应之前,请检查返回的 error。使用 context deadline 来限定单个请求的时长,并使用 defer client.Close() 释放客户端资源。
以下示例获取一个已存在的 AI Scraper 任务。请将 YOUR_TASK_ID 替换为 CreateTask 返回的 ID。
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/scrapeless-ai/sdk-go/scrapeless"
)
func main() {
client := scrapeless.New(scrapeless.WithAIScraper())
defer client.Close()
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel()
result, err := client.AIScraper.GetTaskResult(ctx, "YOUR_TASK_ID")
if err != nil {
log.Printf("Could not retrieve task: %v", err)
return
}
fmt.Println(string(result))
}AI Scraper 的 HTTP 失败会返回一个 error。即便 HTTP 请求成功,其返回的任务仍可能带有 status: "failed";请在解码 JSON 后检查响应的 status 和 message 字段。
配置 / 环境变量
API key 为必填项。端点覆盖为可选项;下表显示了它们的默认值。
请在启动程序前设置环境变量。SDK 还会从工作目录读取 .env 文件。AI Scraper 请求的 HTTP 超时为 30 秒;如需更短的单次请求截止时间,请使用 context.WithTimeout。
| 环境变量 | 用途 / 默认值 |
|---|---|
SCRAPELESS_API_KEY | 来自控制台的必填 API key。 |
SCRAPELESS_BASE_API_URL | https://api.scrapeless.com |
SCRAPELESS_BROWSER_API_URL | https://browser.scrapeless.com |
SCRAPELESS_CRAWL_API_URL | https://api.scrapeless.com |
支持
该 SDK 基于 MIT License 发布。